[C++] [Winsock] recvfrom funktioniert falsch

Parallan

Cadet 3rd Year
Registriert
Okt. 2006
Beiträge
40
Hallo erstmal,
Ich versuche per UDP-Protokoll Daten zu verschicken. Ansich funktioniert alles, aber nur beim ersten Empfangen der Daten (sobald recvfrom nochmal ausgeführt wird, werden dieselben Daten nochmal gelesen ). Und da ist das Problem! Beim 3. mal empfangen wird dann sogar das nächste Packet empfangen, aber da kann es auch sein, dass es 2 mal empfangen wird. Debugger hat nichts neues ans Tageslicht gebracht.

Da ich keine Threads verwende, benutz ich (logischerweise) select und die FD_ Makros.

Ich hab nur eine Stelle im Code, an der gesendet (sendto) (und empfangen (recvfrom) wird) wird, an diesen Stellen sind (genügend) Debug-Ausgaben, alle sende funktionen werden genau einmal ausgführt.

Zur Zicherheit wird bei jeder Winsock Funktion auf == SOCKET_ERROR geprüft und fallls ein fehler auftritt throw aufgerufen (natürlich ist auch try und catch vorhanden), daran kann der Fehler theoretisch auch nicht liegen.

Eigentlich bleibt dann nur noch ein Einstellungsfehler des Sockets oder ein Winsock Fehler übrig (Winsock fehler glaub ich weniger^^).

Wenn mir jemand sagen kann, auf was ich achten muss, bzw was für spezielle Einstellung man machen muss, wär mir sehr geholfen :)

danke schonmal
Parallan
 
Was verwendest du denn für Flags beim Aufruf von recvfrom? Bei MSG_PEEK werden die ausgelesenen Daten nicht aus dem Puffer gelöscht.
Bekommst du auch 2x den Anfang des Paketes? Da jedes Paket fragementiert werden kann, kann es sein, dass im ersten Paket der Anfang der Daten ist und im zweiten Paket der Rest der Daten.
 
Also die MSDN sagt folgendes :

MSG_PEEK

Peeks at the incoming data. The data is copied into the buffer but is not removed from the input queue. The function subsequently returns the amount of data that can be read in a single call to the recvfrom (or recv) function, which may not be the same as the total amount of data queued on the socket. The amount of data that can actually be read in a single call to the recvfrom (or recv) function is limited to the data size written in the send or sendto function call.

Für weiter Informationen und ein simples Beispiel, welches auf UDP verwendet findest du hier.

Hoffe das hilft ein wenig, habs nur überflogen.
 
Hallo Simpson474, hallo Epyx
Ich verwende kein MSG_PEEK als Flag (bei mir ist der Flag-Parameter einfach 0).
Ich hab alle Daten, die gesendet werden, vorher (werden sowieso in char* convertiert) einzeln (die einzelnen chars) ausgegeben, dort funktioniert alles richtig.

Beim Empfangen genau dasselbe, nur dass genau dieselben Daten 2 mal empfangen werden.

In der MSDN hab ich auch schon nach Fehlern, die bei mir liegen, gesucht, aber nix gefunden.

-------

Vielleicht eine andere Lösung: Gibt es eine Methode, ein Packet aus dem Netzwerkpuffer zu löschen?
 
Zuletzt bearbeitet von einem Moderator: (Doppelpost zusammengefügt - bitte Editbutton benutzen!)
Hab mich bisher noch nicht genau mit UDP befasst. Allerdings kann ich dir eine gute Referenz geben.
Beej's Guide to Network Programming ist eigentlich der Standard-Guide, auf den jeder verweist.

Ob da allerdings auch beschrieben wird, ob und wie der Puffer geleert wird kann ich dir nicht sagen. Auf jedenfall findet man da auch eine Passage über recvfrom.
 
Hab gerade mal auf 2 Computern testen können, da kam folgendes raus:

Auf dem anderen Computer (PC1) sendet er einmal und empfängt dort (PC1) aber alles 2 mal (hintereinander).

Auf meinem Computer (PC2) empfängt er alles aber nur 1 mal (also korrekt).

Wie kann ich lösen, dass er die Nachricht vom lokalen Computer auch nur einmal empfängt?
(bei recv kann man ja leider nicht einzelne IPs sperren, sondern nur von allen oder genau einer empfangen (oder?))
 
Zuletzt bearbeitet:
Du erhälst ja bei recvfrom die Adresse des Senders. Vielleicht ist diese einmal 127.0.0.1 und beim zweiten mal deine wirkliche Netzwerkadresse. Das könntest du mal überprüfen.
 
@Simpson474: beide empfangenen (gleichen) Packete kamen von 192.168.1.83 (LAN-IP) (mit recvfrom und "from"-IP 255.255.255.255 (auch getestet mit "from"-IP 0.0.0.0)).
@7H3 N4C3R: Ja, ich mach nen Broadcast (an 255.255.255.255).
 
Wenn du mehrere Netzwerk-Karten oder zusätzlich zur Netzwerkkarte noch ein Loopback-Device installiert hast - und das ListeningSocket nicht über Bind an eine bestimmte IP gebunden hast, ist es kein Wunder wenn du nach einem Broadcast mehrere Antworten bekommst. Ich denke mal, da liegt der Hund begraben.

Über langsame Verbindungen mit Routern dazwischen (z.B. übers Internet) kann es sowieso passieren, dass mit UDP Pakete mehrfach, garnicht oder in der falschen Reihenfolge ankommen, da UDP per se kein verlässliches Protokoll ist.
 
Zurück
Oben