2016-04-15 9 views
0

Linux用のepollというシンプルなTCPネットワークライブラリを作成しました。Linux:Recvは無作為にゼロを返します

私のテストの1つでは、ライブラリのスループットをテストしたいと思います。 50000バイトの2000000メッセージを送信します。

バインドされたソケットは、800000以上のmsgを受信した後にrecvにランダムにゼロを返します。

その他の場合、すべてのメッセージが受信されます。何が起こるのでしょうか?

recv呼び出しはsparrow.cファイルの393行目です。

  1. https://github.com/xekoukou/sparrow
  2. https://github.com/xekoukou/sparrow/blob/master/thr_client.c
  3. https://github.com/xekoukou/sparrow/blob/master/thr_server.c

編集:

私は data_in->len > data_in->cur

int result = recv(sock->fd, data_in->data + data_in->cur, data_in->len - data_in->cur, 0); 

    //On error or connection closed. 
    //TODO We need to handle closed connections differently, possibly automatically reconnecting. 
    if(result <= 0) { 
     //TODO Make Dprintf 
     printf("Receive error or we received a signal that the connection closed.\nWe are closing the connection.\n"); 
     spev->error = 1; 
     sparrow_socket_close(sp,sock); 
     return 0; 
    } 

はあなたがここにライブラリを確認することができていることを確認することができます

  1. コードの問題が見つかりました。最初に、EAGAINエラーをチェックしなかったコードの小さな部分がありました。私のコードは、回復していないエラーとみなして接続を閉じただけです。
  2. @EJPが効果的に質問に答えました。 Recvは、接続が閉じている場合、またはサイズがゼロのバッファがある場合にのみゼロを返します。
  3. もう1つ興味深いのは、800000回のループで何かが発生したときに効果的にデバッグする方法です。
+0

申し訳ありませんが、あなたのソースコード全体を読むことができません。 'sparrow_recv'メソッドはどこにありますか?あなたの質問にクリティカルコードを含めてください。 –

+0

私はrecvコールの場所を指していました。それが役に立てば幸い。 sparrow_recvは単に入力バッファをsparrowに与えます。 Recvは_sparrow_waitの内側にあります。 –

+3

'recv()'は、ストリームの最後にゼロを返します。これは、ピアが接続を閉じるときに発生します。それについて何も「ランダム」ではありません。 – EJP

答えて

1

recv()は、ストリームの終わりにゼロを返します。これは、ピアが接続を閉じるときに発生します。それについては何も「ランダム」ではありません。

関連する問題