2012-05-31 8 views
6

Ich schreibe eine Nachrichtenschicht für mein verteiltes System. Ich verwende IOCP, dh die Socket.XXXAsync-Methoden.SocketAsyncEventArgs Puffer ist voll von Nullen

Hier ist etwas ziemlich nah an, was ich tue (in der Tat, meine Funktion erhalten auf seinem basiert): http://vadmyst.blogspot.com/2008/05/sample-code-for-tcp-server-using.html

Was habe ich jetzt gefunden ist, dass zu Beginn des Programms (zwei Testserver sprechen miteinander) Ich erhalte jedes Mal eine Anzahl von SAEA-Objekten, bei denen der .Buffer vollständig mit Nullen gefüllt ist, aber der .BytesTransfered ist die Größe des Puffers (1024 in meinem Fall).

Was bedeutet das? Gibt es eine besondere Bedingung, nach der ich suchen muss? Mein System interpretiert dies als eine unvollständige Nachricht und geht weiter, aber ich frage mich, ob ich tatsächlich einige Daten vermisse. Ich hatte den Eindruck, dass wenn Sie nichts erhalten würden, Sie keinen Rückruf bekommen würden. Auf jeden Fall kann ich in WireShark sehen, dass keine Null-Länge-Pakete reinkommen.

Ich habe Folgendes gefunden, als ich es googled, aber ich bin mir nicht sicher, dass mein Problem das gleiche ist: http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/40fe397c-b1da-428e-a355-ee5a6b0b4d2c

http://go4answers.webhost4life.com/Example/socketasynceventargs-buffer-not-ready-121918.aspx

+0

Ich hatte keine Datenverarbeitungsfehler von verlorenen Daten, so denke ich, dass nichts verloren ist. Aber das wirft immer noch die Frage auf, warum die Methode mehrmals ohne Ergebnis zurückkehren würde. – Carlos

+1

Es ist schwierig, eine Lösung für Sie ohne Ihre kurze Beschreibung (mit Code) zu bieten. Ich hatte jedoch Erfahrung mit Sockets und kann eine höhere Abstraktion empfehlen - Network Stream. Network Stream verfügt über alle Funktionen von Async-Callback, die Sie verwenden möchten. Sehen Sie sich http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.aspx und http://msdn.microsoft.com/en-us/library/system.net.sockets an. networkstream.beginwrite.aspx HTH –

+0

Ist es die gleichen zugrunde liegenden Aufrufe? Es klingt nützlich. Auch der Code, auf den ich mich beziehe, ist in der Verbindung. – Carlos

Antwort

0

ich bin sicher nicht das, was in der verknüpften Beispiel vor sich geht. Es scheint synchrone asynchrone Sockets zu verwenden. Ich kann keine Rückrufe oder ähnliches im Code sehen. Sie müssen möglicherweise neu überdenken, ob Sie synchrone oder asynchrone Sockets benötigen :).

Das Problem liegt an der Möglichkeit, dass Ihre Funktionen versuchen, in den Puffer zu lesen/zu schreiben, bevor das Senden/Empfangen des Netzwerks abgeschlossen wurde. Verwenden Sie die Rückruffunktion, die im asynchronen Socket enthalten ist. Z.B.

+0

Die Callbacks sind die Ereignishandler auf den SAEA-Objekten. Ich habe den Code mit minimalen Grammatikfehlern ausgeführt. – Carlos

+0

Ist es möglich, dass Sie Ihren Empfängercode in Pastebin oder ähnliches einfügen, habe ich nur das Beispiel gesehen, auf das Sie sich stützen. – themartinmcfly