2016-05-03 23 views
0

私はTCPサーバーを作成していました。私はlocalhost上でうまく動作します。リモートで展開すると、宛先に向かって途中でいくつかのバイトが失われます。TCPパケット損失の部分

localhostとremoteでnetcatを使用して、2つの出力のdiffを作成しました。また、紛失バイトは確定的です。

したがって、同じパケットが失われる可能性は非常に低いので、パケットロスであるとは限りません。

ソケットの書き込みサイズを1000バイトに減らそうとしましたが、まだこの問題が発生しています。

この種のエラーに共通して考えられる原因はありますか?

私はコードを投稿できましたが、Boost asioライブラリのsocket.sendだけです。私はエラーがコードから来ているかどうかわからない、そうでなければ、それはlocalhostで動作しませんでした。

はあなたの助けのために事前にありがとうござい

+2

Tcpは無力です。それは仕様https://tools.ietf.org/html/rfc793にあります。あなたはtcpを使用しているか、他の場所に問題がありますか? –

+6

これは、 'send()'の戻り値をチェックしていないことが原因です。 'send(sck、data、1000、0)'を呼び出すと、 '990'を返し、戻り値をチェックして残りの10バイトを再送信しなければ、それらは失われます。これは 'recv()'でも同じです。 – rodrigo

+0

@Hdヒール私は損失が少ないことを知っています。だからここで私は –

答えて

2

ソケットを使用してデータを送信し、それはあなたが関数に渡す量より少なくてもよい、実際に送信されたバイト数を返しますsend()機能します。

あなたはI/O、時々このような関数が使用されているブロックを使用する場合:

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; 
} 

あなたはアプローチが有用ではありませんboost::asioではなく、生のソケットを使用しているので。しかし、async_sendのドキュメントでは、必要なものを正確に得ることができます。

送信操作では、すべてのデータをピアに送信できない場合があります。非同期操作が完了する前にすべてのデータが確実に書き込まれるようにする必要がある場合は、async_write関数の使用を検討してください。

関連する問題