Was kann ich tun, um zu vermeiden, TCP Zero Window - / TCP-Fenster-Voll auf der Empfänger Seite?

Ich habe eine kleine Anwendung, die sendet Dateien über das Netzwerk an einen agent, der auf Windows OS.

Wenn diese Anwendung läuft auf Windows funktioniert alles einwandfrei, die Kommunikation ist OK und die Dateien sind alle erfolgreich kopiert.

Aber, wenn diese Anwendung läuft auf Linux (RedHat 5.3, der Empfänger ist immer noch Windows), sehe ich in Wireshark Netzwerk-trace-messages von TCP Zero Window und TCP Window Full erscheint auf jeweils 1-2 Sekunden. Der agent schließt dann die Verbindung nach ein paar Minuten.

Den Windows - Linux-code ist fast das gleiche und ziemlich einfach. Die einzige nicht-triviale operation ist setsockopt mit SO_SNDBUF und mit dem Wert 0xFFFF. Das entfernen dieser code hat nicht geholfen.

Kann mir bitte jemand helfen mit diesem Problem?

EDIT: hinzufügen das senden von code - es sieht aus, dass es behandelt teilweise richtig schreibt:

int totalSent=0;
while(totalSent != dataLen)
{
    int bytesSent 
        = ::send(_socket,(char *)(data+totalSent), dataLen-totalSent, 0);

    if (bytesSent ==0) {
        return totalSent;
    }
    else if(bytesSent == SOCKET_ERROR){
#ifdef __WIN32
        int errcode = WSAGetLastError();
        if( errcode==WSAEWOULDBLOCK ){
#else
            if ((errno == EWOULDBLOCK) || (errno == EAGAIN)) {
#endif
            }
            else{
                if( !totalSent ) {
                    totalSent = SOCKET_ERROR;
                }
                break;
            }
        }
        else{
            totalSent+=bytesSent;
        }
    }
}

Vielen Dank im Voraus.

  • Mehr details? Ist die Datei erfolgreich übertragen, nur in einem langsameren Tempo oder die übertragung fehlschlägt? Wenn es fehlschlägt, ist, wo ist er aufgetreten? Ist alles immer über oder wird es scheitern auf halbem Weg durch?
  • danke. Die übertragung schlägt fehl. Wenn ich ein Ordner enthält, zum Beispiel, 2 GB 3 KB - 50 KB Dateien, überträgt es manchmal ~0,5 GB, manchmal ~1,3 GB Daten und dann scheitert.
  • Welche Fehlermeldungen Sie erhalten und welche Seite ist das Herunterfahren der Verbindung? Sind Sie auf der Verwendung von blockierenden oder nicht-blockierenden I/O. Sie haben einen dedizierten thread zu tun I/O? Je mehr details, desto besser, und wenn Sie könnten post-code-Fragmente, die wäre die beste.
  • Was ist ::send(...)? Ist dieser ein Mitglied der Klasse die wraps die standard - send(...) Funktion?
  • Können Sie nach dem Empfang der code auch? Es klingt wie Daten möglicherweise nicht immer abgerissen werden, auf der Empfängerseite.
InformationsquelleAutor rkellerm | 2010-08-08
Schreibe einen Kommentar