Frage zu UDP



  • Hey,

    ich möchte per UDP Daten senden und empfangen - und das klappt auch soweit.
    Allerdings habe ich ein paar Sachen noch nicht rausgefunden und
    hoffe mir kann jemand helfen!

    Was passiert mit Daten, die ich von einem UDP-Client mit sendto() sende,
    die aber nicht von einem Server empfangen werden?

    Wird eine Message gesendet (und welche?) wenn Daten über den UDP Port ankommen?
    Oder wie schaffe ich es, dass mein Programm nicht an dem recvfrom() Befehl hängen
    bleibt?

    Viele Dank für jede Hilfe!
    Huddi



  • huddi schrieb:

    Hey,

    ich möchte per UDP Daten senden und empfangen - und das klappt auch soweit.
    Allerdings habe ich ein paar Sachen noch nicht rausgefunden und
    hoffe mir kann jemand helfen!

    Was passiert mit Daten, die ich von einem UDP-Client mit sendto() sende,
    die aber nicht von einem Server empfangen werden?

    Wird eine Message gesendet (und welche?) wenn Daten über den UDP Port ankommen?
    Oder wie schaffe ich es, dass mein Programm nicht an dem recvfrom() Befehl hängen
    bleibt?

    Viele Dank für jede Hilfe!
    Huddi

    UDP ist verbindungslos. Es gibt keinen Server. Es gibt auch keine Garantie, dass deine Daten ankomme und wie sie ankommen (Reihenfolge). Dafür ist UDP nicht ausgelegt. Wenn dir das wichtig ist, dann solltest du TCP verwenden.

    Damit das Programm nicht hängen bleibt (blocking call), kannst du non-blocking Sockets verwenden. Näheres zu dem gesagten findest du bei deiner Suchmaschine deines Vertrauens 🤡



  • falls es noch jemand anders sucht:
    mit
    ioctlsocket(SOCKET, FIONBIO, *u_long);
    (*u_long!=0 für non blocking socket)
    hats bei mir für windows geklappt



  • wenn man ganz normal von CSocket oder CAsyncSocket ableitet hat man eigentlich nicht das problem weil man benachrichtigt wird wenn Daten verfügbar sind, also der Handler wird ausgelösst. Das was du gemacht hast schaut mir aus wie ein Polling auf der recvfrom() funktion



  • Okay, ich habe mich auch leider geirrt. Wenn die Daten zu schnell
    gesendet werden, werden die zwischengespeichert und nach und nach abgearbeitet.
    Ich möchte allerdings nur das aktuellste Paket empfangen.

    Ich benutze Funktionen aus der Winsock2.h und erstelle daraus einen Winsock 2.0
    Hab im Netz leider nichts wirklich brauchbares gefunden, aber im Grunde kann
    der Code dafür doch nicht so sehr aufwändig sein?



  • na wenn du nur das letzte packet haben willst, was bei UDP eh nicht geht ausser du verpasst deinen Telegramm nen Zähler mit bei, dann musst du so lange abholen bis du das letzte hast, Windows stellt dir alle empfangen zu.

    denk dran bei UDP muß die reihenfolge der empfangenen telegramme nicht mit der absendereihenfolge übereinstimmen, also das letzte empfangene telegramm kann eina aus der mitte der gesendeten sein, wenn du verbindungsorientiert übertragen willst und die reihenfolge auch stimmen soll, dann solltest du TCP benutzen



  • Überhaupt kannst du nicht in Paketen denken. Wenn du "Hallo, Welt!" sendest, dann heißt das nicht, dass der Empfänger auch "Hallo, Welt!" empfängt. Es kann auch sein, dass er "Hallo, W" und erst danach "elt!" empfängt. Du kannst hier also nicht von Paketen sprechen. Das ist bei TCP übrigens nicht anders. Da muss man sich dann eine Funktion schreiben, die das in Pakete aufteilt. Beispielsweise anhand eines \r\n am Ende jeder Nachricht.

    Was hast du denn genau vor? Eventuell ist ja TCP geeigneter.



  • Hier gibts übrigens noch Informationen/Beispiele zum Thema. Insbesondere im Bezug auf TCP.

    http://www.c-worker.ch/



  • CTecS schrieb:

    na wenn du nur das letzte packet haben willst, was bei UDP eh nicht geht ausser du verpasst deinen Telegramm nen Zähler mit bei, dann musst du so lange abholen bis du das letzte hast, Windows stellt dir alle empfangen zu.

    Ich hab das jetzt so gemacht, dass ich solange abhole, bis ich von
    recvfrom() SOCKET_ERROR zurückbekomme, also -1
    Ist das seehr hässlich, oder kann man das in einem Hobbyprojekt auch mal
    so machen?
    Wo werden die ganzen Daten eigentlich zwischengespeichert? Gibt es da eine Grenze?

    CTecS schrieb:

    denk dran bei UDP muß die reihenfolge der empfangenen telegramme nicht mit der absendereihenfolge übereinstimmen

    Weißt du vielleicht unter welchen Umständen, oder wie oft das vorkommt?
    Ich habe ein paar Tests laufen lassen, in denen ich immer das letzte paket
    bekommen habe.

    .... schrieb:

    Es kann auch sein, dass er "Hallo, W" und erst danach "elt!" empfängt

    Kann es auch sein, dass wenn sich das einmal verschoben hat ich immer
    "elt!Hallo, W" empfange?
    Mein Empfänger ist nicht empfindlich, falls mal schrott geliefert wird,
    aber das sollte nicht zu oft vorkommen :).



  • 1. in deinem Privaten Projekt kannst du machen was du willst
    2. natürlich bekommst du immer das letzte, weil du sicher in deinem Privaten netz wenig oder kein Trafic hast
    3. ne kann nicht sein und wenn du nicht auf UTP zwingend angewiesen bist, würde ich TCP bevorzugen, da weisst du auch ob die gegenseite da ist oder ob die verbindung getrennt wurde, die reihenfolge stimmt da auch immer

    Wie groß der Puffer von Windows ist kann ich dir so aus dem Hut nicht sagen



  • Thx!

    Aber nochmal zum Thema privates Projekt. Ist das jetzt hässlich wie ich das
    gemacht habe oder nicht so schlimm :)? Will ja auch was dabei lernen!



  • also ich würde eine klasse von CSocket oder CAsyncSocket ableiten, dann hast du auch die Handler für die Receiv


Anmelden zum Antworten