1

ソケットrecv()呼び出しをループするTCP/IPアプリケーションをWindows7に実装しています。少量のデータ(<5 MB)の場合は正常に機能しますが、大量のデータ(> 20 MB)の場合、その間にrecvが失敗します。

詳細:私のアプリは、同じマシンで実行されているHTTPサーバーと通信する必要があります。このシーンでは、tcpアプリが大量のデータをHTTPサーバーに送信しています。

エラー=2になり、recvは0を返します。

エラー2はENOENTを意味しますが、それはどういう意味ですか?。誰かがこれが(ソケットに関して)何であるか、そして私がこれを回避する方法を知っていますか?

msgLen = recv(s,msg,BUFFER_SIZE,0);

if(msgLen > 0)
{
  // do processing
}
else
{
  printf("\n no data received .... msgLen=%d",msgLen);
  printf("\n no data received .... errno=%d",errno);
}

コメントごとにコードを更新

msgLen = recv(s,msg,BUFFER_SIZE,0);

if(msgLen > 0)
{
  // do processing
}
else if(msgLen == 0)
{
  printf("\n sender disconnected");
}
else
{
  printf("\n no data received .... msgLen=%d",msgLen);
  printf("\n no data received .... errno=%d",WSAGetLastError());
}

私が今得たエラーは次のとおりです。

  1. まず、recv = 0を何度も繰り返します。つまり、送信者が切断されます。
  2. 最後に、recvは-1を返し、error=10053です。

TCP/IPアプリケーションがHTTPサーバーにデータを送信しています。同じことが小さなデータでも問題なく機能しますが、問題は大量のデータにあります。HTTPサーバーがタイムアウトしていませんか?

4

1 に答える 1

2

0を返す場合recv()、相手が正常に切断されたことを意味します(要求されたバッファサイズが0でない場合)。 (-1)recv()を返す場合にのみエラーコードを提供します。SOCKET_ERRORWindowsでは、次のようにWSAGetLastError()ではなく、エラーコードを取得するために使用する必要がありますerrno

msgLen = recv(s,msg,BUFFER_SIZE,0);

if(msgLen > 0)
{
    // do processing
}
else if (msgLen == 0)
{
    printf("\n sender disconnected");
}
else
{
    printf("\n no data received .... error=%d",WSAGetLastError());
}

また、非ブロッキングソケットを使用している場合、エラーコードがである可能性があることWSAEWOULDBLOCKにも注意してください。これは致命的なエラーではありません。を使用select()して、ソケットにデータがあることを検出し、再試行できますrecv()

于 2013-03-15T16:00:53.227 に答える