2016-05-03 9 views
0

Ich schrieb einen TCP-Server. Ich arbeite gut mit localhost. Bei der Remote-Bereitstellung gehen einige Bytes auf dem Weg zum Ziel verloren.Teile des TCP-Paketverlustes

Ich benutzte netcat auf localhost und remote und machte ein diff der beiden Ausgänge und die verlorenen Bytes sind deterministisch.

Also bezweifle ich, dass es Paketverlust ist, da es sehr unwahrscheinlich ist, dass das gleiche Paket verloren gehen würde.

Ich habe versucht, die Größe meiner Schreibvorgänge auf dem Socket auf 1000 Bytes zu reduzieren, aber ich bekomme dieses Problem immer noch.

Gibt es gemeinsame Gründe für diese Art von Fehlern?

Ich könnte den Code aber es ist nur ein socket.send von der Boost Asio-Bibliothek. Ich bin nicht sicher, dass der Fehler vom Code kommt, sonst würde es auf localhost nicht funktionieren.

Vielen Dank im Voraus für Ihre Hilfe

+2

Tcp ist verlustfrei. Es ist in der Spezifikation https://tools.ietf.org/html/rfc793. Sind Sie sicher, dass Sie tcp verwenden oder das Problem an anderer Stelle ist –

+6

Der häufigste Grund dafür ist, die Rückkehr von 'send()' nicht zu überprüfen. Wenn Sie 'send (sck, data, 1000, 0)' aufrufen, wird '990' zurückgegeben und Sie können den Rückgabewert nicht überprüfen und die verbleibenden 10 Bytes erneut senden, dann werden Sie sie verlieren. Dasselbe gilt für 'recv()'. – rodrigo

+0

@Hd Heilung Ich weiß, dass es weniger Verlust ist. Deshalb frage ich hier –

Antwort

2

Wenn Daten über einen Socket zu senden und Funktion send() es die Anzahl der Bytes, die tatsächlich gesendet zurückgibt, die als die Menge geringer sein kann Sie an die Funktion übergeben.

Wenn Sie blockieren I/O, manchmal eine Funktion wie folgt verwendet:

ssize_t send_all(int socket, const void *data, size_t len) 
{ 
    while (len > 0) 
    { 
     ssize_t r = send(socket, data, len, 0); 
     if (r < 0) 
     { //you could also return -1 on EINTR 
      if (errno == EINTR) 
       continue; 
      else 
       return -1; 
     } 
     len -= r; 
     data = (const char*)data + r; 
    } 
    return len; 
} 

Da Sie boost::asio verwenden, nicht Raw Sockets, die Annäherung nicht nützlich ist. Aber in der async_send Dokumentation erhalten Sie genau das, was Sie brauchen:

Der Sendevorgang kann nicht alle Daten an den Peer senden. Erwägen Sie die Verwendung der async_write-Funktion, wenn Sie sicherstellen müssen, dass alle Daten geschrieben werden, bevor der asynchrone Vorgang abgeschlossen ist.