Winsock recvfrom gibt unterschiedliche Anzahl an bytes zurück
-
Hallo,
ich lese einen UDP Stream mit immer gleicher Länge von 50 Zeichen ein.
Doch ab und zu kommt es vor das er nur 45 Zeichen einliest. Bei einer Überprüfung mit Ethereal ob auch wirklich alle Zeichen gesendet werden habe ich festgestellt das dies der Fall ist. Also an der Übertragung kann es nicht liegen die 50 Zeichen kommen wirklich an.Kennt jemand das Problem, oder besser eine Lösung? Vielen Dank.
Gruß
Sven
-
UDP ist eben kein stream, deshalb ist es ungewöhnlich, dass dir 5 bytes fehlen. da muss irgendwo ein bug sein oder du sendest tatsächlich manchmal kürzere paketchen.
-
Hi,
danke für die schnelle Antwort. Die Anzahl der Zeichen überprüfe ich gleich nach dem Empfangen mit recvfrom. Das nicht alle Zeichen gesendet werden kann nicht sein, da ich das Senden mit Ethereal überprüfe.Gruß
Sven#EDIT: Ich habe festgestellt, das der Obere Teil der Daten meinen gesendeten Daten entspricht?! Kurz zum Ablauf, ich sende einen Broadcast an den Port 4742 als Antwort bekomme ich auf den Port 27015 ein Paket. (alles UDP) Diese Daten entsprechen zum teil der meiner gesendeten. Wie kann das sein? Sollte ich vielleicht lieber mit listen und nicht gleich mit recvfrom auf Daten warten.
-
dann geht wohl beim empfang was schief.
wahrscheinlich ein bug im empfangscode, UDP pakete trudeln nicht fetzenweise ein, auch nicht, wenn IP-fragmentierung mit im spiel ist.
hast du mal die pakete beim empfänger mit ethereal gesnifft?
-
Hi,
ich habe alles auf dem Empfänger-Recher überprüft. Auf dem Server bzw. eigentlich ist er der Client dürfte das schwierig werden, da es eine Kartenleserkonsole ist.Also an dem Rechner wo die Daten empfangen werden, kommt alles korrekt an.
Ich habe so das Gefühl es kommt irgend etwas durcheinander. Habe vorsichtshalber für das senden und empfangen zwei getrennte Sockets benützt, keine Änderung.Gruß
Sven
-
gortosch schrieb:
Auf dem Server bzw. eigentlich ist er der Client dürfte das schwierig werden, da es eine Kartenleserkonsole ist.
und da ist ein netzwerkstack drauf? vielleicht ist der ja buggy?
-
Wieso sollte am Sender etwas fehlerhaft sein, wenn Ethereal beim Empfänger alles korrekt anzeigt?
Gruß
SvenEdit: Wie kann ich an eine Broadcastadresse mit sendto etwas senden? Er bringt mir jedes mal den Fehler 10013 das er an eine Broadcastadresse nichts senden kann.
setsockopt(iSocket, SOL_SOCKET, SO_BROADCAST, bOptVal, bOptLen);
Funktioniert nicht wobei bOptVal = TRUE ist und bOptLen = sizeof(BOOL);
-
haste schon mal ping auf die broadcast-adresse versucht??
geht auch nicht... macht auch sinn, sonst würde ja jeder alles broadcasten und das netz lahm legen...
-
Huhuh, ich brauche aber den Broadcast um die IP-Adresse der Terminals zu bekommen.
Gruß
Sven
-
Argh, jetzt geht alles. Lol... das Problem war das durch die Broadcastanfrage 4-5 Pakete in unterschiedlicher Reihenfolge bei mir aufgeschlagen sind. Der UDP Broadcast geht auch, habe vergessen zu casten und die Adresse des BOOLs zu übergeben:
setsockopt(iSocket, SOL_SOCKET, SO_BROADCAST, (char*)&bOptVal, bOptLen);
Nur, jetzt stellt sich die Frage wie unterscheide ich die Pakete? Nur an der Größe? Das könnte ins Auge gehen.
EDIT: Die anderen Pakete kommen alle von dem Rechner der den Broadcast ausgelöst hat. Kann mir das einer erklären?
-
Alles zurück, die vielfachen Pakete kommen dadurch zu stante, dass ich noch ein paar Simulatoren im Hintergrund laufen habe lassen. Asche auf mein Haupt.
Danke.
Gruß
Sven