2012-05-10 29 views
5

Ich habe ein sehr nerviges Problem, dass ich mehrmals in anderen Foren fand, aber ich kann keine richtige Lösung finden. Das Problem ist recv() gibt 0 für die letzten paar Bytes einer Verbindung zurück. Hier sind einige Hintergrundinformationen.recv() gibt 0 zurück

  • Beide Anwendungen (Client/Server) werden auf demselben Computer ausgeführt.
  • Beide (Client/Server) -Sockets sind nicht blockierend
  • Die übertragene Datengröße beträgt 53 Bytes.
  • Beide (Client/Server) Aufruf Herunterfahren und Closesocket, wenn die letzte send()/recv() ausgeführt wurde.
  • Ich habe auch versucht mit SO_LINGER und 10 Sekunden, ohne Erfolg entweder

I send() mehrmals (kleine Stücke) nennen und von der Clientseite 53 Bytes übertragen werden. Der Server ruft recv() mehrmals (4-Byte-Anfragen) auf und liest 49 Bytes und gibt dann 0 zurück (54 Bytes - 49 Bytes, also 4 Bytes fehlen).

MSDN und einige Foren schreiben für nicht-blockierende Sockets:

  • recv() auf jeden Fall wieder < 0 auf Fehler und errno/WSAGetLastError gesetzt
  • recv() auf jeden Fall zurückgibt = 0, wenn die andere Seite die Verbindung
  • recv() geschlossen definitiv wieder> 0, wenn Daten

MSDN gelesen wurde auch sagt:

Bei Verwendung der Closesocket- oder Shutdown-Funktionen mit SD_SEND oder SD_BOTH wird ein RELEASE-Signal auf dem Steuerkanal ausgegeben. Aufgrund der Verwendung separater Signal- und Datenkanäle durch ATM ist es möglich, dass ein RELEASE-Signal das entfernte Ende erreichen kann, bevor das letzte der Daten sein Ziel erreicht, was zu einem Verlust dieser Daten führt. Eine mögliche Lösungen ist die Programmierung einer ausreichenden Verzögerung zwischen den letzten Daten gesendet und die Closesocket oder Shutdown-Funktion ruft für einen ATM -Buchse. http://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx

aber noch kein Erfolg, bekomme ich immer noch einige Unterbrechungen in 10% aller Anschlüsse nach dem 49 Byte empfangen wird, 90:

Dies wird im Beispiel von recv() und send() angesehen % der Verbindungen sind erfolgreich. Irgendwelche Ideen? Danke.

+0

Ich vermute, Sie machen eine von mehreren klassischen Socket-Programmierung Fehler.Ich habe ein paar Ideen, aber ich würde lieber Ihren Code sehen, bevor Sie etwas schreiben. – selbie

Antwort

9

recv() gibt 0 nur zurück, wenn Sie einen 0-Byte-Puffer anfordern oder der andere Peer ordnungsgemäß getrennt wurde. Wenn Sie nicht alle erwarteten Daten erhalten, lesen Sie die Daten nicht richtig. Bitte aktualisieren Sie Ihre Frage mit Ihrem tatsächlichen Code.

Verwandte Themen