Netzwerkprogrammierung: Socket.Receive liefert falche Ergebnisse
-
Es soll von einem Socket ein Paket mit der Größe PacketSize gelesen werden und in den Buffer recived gespeichert werden
Ich suche den Unterschiden zwischen diesem Code
recived = new byte[PacketSize]; int gelesen = m_Socket.Receive(recived, PacketSize, 0); if(gelesen != PacketSize) throw new Exception("Netzwerkprobleme!");
und diesem:
// Daten empfangen recived = new byte[PacketSize]; int offset = 0; while(PacketSize != 0) { int gelesen = m_Socket.Receive(recived,offset,PacketSize, 0); offset += gelesen; PacketSize -= gelesen; }
Der erste Code scheint mir eleganter, jedoch füllt es meinem Buffer recived nicht richtig am Anfang stehen noch richtige Daten - der Rest des Buffers (ca. 3/4) ist mit Nullen gefüllt
-
Im ersten Beispiel fehlt auch die Schleife
Du bekommst nicht den ganzen Netzwerkstream mit einmal lesen, du musst das in der Schleife aufrufen, genau das machst du im zweiten Beispiel, im ersten nicht.
-
warum wird dann keine Exception geworfen?
if(gelesen != PacketSize) throw new Exception("Netzwerkprobleme!");
beim ersten mal lesen ist gelesen immer gleich PacketSize - falls es nicht so wäre würde ich ja ne Exception bekommen
-
Vertexwahn schrieb:
warum wird dann keine Exception geworfen?
if(gelesen != PacketSize) throw new Exception("Netzwerkprobleme!");
beim ersten mal lesen ist gelesen immer gleich PacketSize - falls es nicht so wäre würde ich ja ne Exception bekommen
Schau dir mal die Doku dazu an:
Beispiel:
If you are using a connection-oriented Socket, the Receive method will read as much data as is available, up to the number of bytes specified by the size parameter. If the remote host shuts down the Socket connection with the Shutdown method, and all available data has been received, the Receive method will complete immediately and return zero bytes.
Das könnte z.b. der Fall bei dir sein. Oder wenn ein Timeout auftritt liefert er dir den Rest auch mit Nullen.
-
aber diese Nullen können doch nicht als gelesene Bytes gewertet werden - ich müßte doch zuminderst ne Exception bekommen...
-
Vertexwahn schrieb:
aber diese Nullen können doch nicht als gelesene Bytes gewertet werden - ich müßte doch zuminderst ne Exception bekommen...
Lies die Doku! Da steht in dem Fall nichts von einer geworfenen Exception! Warum frag mich nicht, ist aber so
-
Da steht in dem Fall nichts von einer geworfenen Exception
ich meine doch meine eigene Exception:
if(gelesen != PacketSize) throw new Exception("Netzwerkprobleme!");
-
Ich denke mal wenn er den Puffer mit Nulen auffüllt, gibt er auch den vollen Puffer zurück als des was er geschrieben hat, und dann springt er nie rein in deine Exception.
-
toll muss ich mir jetzt ne Funktion schreiben, die dann feststellt was der Nutzteil der Daten ist? Und was ist, wenn ich zufälliger weiße mal 0 als Nutzdaten habe? Irgendwie muss man doch feststellen können wieviele Daten jetzt in den Buffer geschrieben wurden... zzzsss...
-
Was sind denn jetzt die Werte von 'gelesen' und 'PacketSize'?
-
Was sind denn jetzt die Werte von 'gelesen' und 'PacketSize'?
gelesen == PacketSize