[gelöst] UDP-Socket Verbindung klappt nur in eine Richtung

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • [gelöst] UDP-Socket Verbindung klappt nur in eine Richtung

    Hallo,
    ich beschäftige mich momentan mit der Socketprogrammierung unter Windows. Ich habe mich an das Buch "C von A bis Z" sowie "C++ von A bis Z" von Jürgen Wolf gehalten. Dort gibt es ein Beispiel, in dem man vom Client einen String an den Server schickt und dieser den String ausgibt. Nun möchte ich das Programm so abändern, dass der Server den String unverändert wieder zum Client zurückschickt und dieser ihn dann ausgibt. Mit TCP habe ich es hinbekommen, ich brauche das ganze aber mit UDP.
    Der funktionierende Code vom Server sieht folgendermaßen aus:

    C-Quellcode

    1. // udp_echo_server.cpp
    2. #include "socket.h"
    3. #include <iostream>
    4. using namespace std;
    5. int main() {
    6. try {
    7. Socket empfangen;
    8. empfangen.UDP_create();
    9. empfangen.bind( 15000 );
    10. cout << "Server wartet auf Daten ..." << endl;
    11. try {
    12. while ( true ) {
    13. string s;
    14. empfangen.UDP_recv(s);
    15. cout << "Daten erhalten: " << s << endl;
    16. }
    17. }
    18. catch ( SockExcept& ) {
    19. }
    20. }
    21. catch (SockExcept& e) {
    22. cout << "Exception wurde ausgeworfen: "
    23. << e.get_SockExcept() << endl;
    24. }
    25. return 0;
    26. }
    Alles anzeigen

    Bisher sind jedoch sämtliche Versuche ihn abzuändern, fehlgeschlagen. Entweder er gibt in einer Endlosschleife den Text aus, ohne ihn zurückzusenden oder das Programm stürzt sofort nach dem Starten ab. Kann ich auch eine send-Funktion nutzen, die kein Argument braucht bzw. der ich ein Argument übergeben kann, in dem die Adresse, wohin er es senden soll, übergeben wird? Wohin die Antwort gehen muss, muss doch irgendwie aus der empfangenen UDP-Nachricht auszulesen sein, oder? Und kann ich auf dem gleichen Socket antworten oder muss ich dafür ein 2. Socket erstellen? Ich hatte mir auch überlegt, im Serverprogramm genauso ein Socket zu erstellen wie im Client:

    Quellcode

    1. Socket client;
    2. client.UDP_create();
    3. client.bind(15000);
    4. string argv_1 = argv[1];
    5. ...
    6. string s;
    7. getline(cin, s, '\n');
    8. client.UDP_send(argv_1, s, 15000);

    in argv[1] gebe ich dem Client die IP-Adresse vom Server mit. Allerdings funktioniert das im Server ja nicht, weil der Server ja vor dem Client gestartet wird und ich ja garnicht weiß, wohin ich dann senden soll.
    Ich hoffe mein Text ist jetzt nicht zu verwirrend gewesen. Für jegliche Hilfe bin ich jetzt schon mal dankbar.

    mfg Matthias

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Matze8426 ()

  • Ohne jetzt deinen Code (mangels C Kenntnissen) genauer angesehen zu haben, solltest du beachten, dass UDP paketorientiert ist. Das heißt, dass wenn der Server die Daten erhalten hat, er nicht mehr, wie bei TCP, auf die bestehende Verbindung/Socket zurückgreifen kann, sondern er muss selbst wieder eine ganz neue Verbindung zum Client aufbauen. Dazu muss beim Client ein entsprechender Port geöffnet sein und es muss die IP-Adresse bekannt sein.
    Und Wrapper verstecken das Problem vielleicht, aber sie lösen es nicht. Abstrahierungsschichten sollten IMHO immer nur eine Hilfe sein, um seinen Code zu verkürzen/lesbarer zu machen und nicht, um wie in deinem Fall, die Materie zu verstecken. Mein Tipp an dich: Lerne, wie man eine UDP-Verbindung mit den nativen C Funktionen aufbaut. Erst wenn du das beherrschst und es vollständig verstanden hast, dann solltest du auf Wrapper/andere Abstrahierungsschichten zurückgreifen.
    Open Source --> Programmieren aus Leidenschaft :!:

    Ich stehe weder für privaten Support per PM noch über einen IM zur Verfügung. Danke.
  • Das OSI-Modell etc. kenne ich gut. Das UDP paketorientiert ist, weiß ich. Das ich auf keine bestehende Verbindung zurückgreifen kann, weiß ich auch. Genau das war ja mein Problem, ich wusste, wie ich mit nativen C-Funktionen eine UDP-Verbindung zum Server aufbauen konnte, weil ich ja meinen Server kenne. Ich wusste nur nicht, wie ich eine Verbindung vom Server zum Client bekam, weil ich nicht wusste, welche IP mein Client hat und welchen Port ich benutzen musste. Ist jetzt aber auch egal, habe meine 1000000 Performancemessungen für meinen Prof durchgeführt, sie bei ihm abgeliefert und er war damit zufrieden.