2

タイトルはほとんどそれをすべて言います。クライアントからの入力を待機している受信スレッドがありますが、何も読み取られない場合、読み取った 0 バイトを返す代わりに -1 を返しますが、エラーは返されません。

なぜこの関数がそのように動作するのかについてのヒントはありますか?

ありがとう

編集:

これが受信コードです

sockaddr_in remote;
remote.sin_family = AF_UNSPEC;
remote.sin_addr.s_addr = inet_addr( _host.c_str() );
remote.sin_port = htons( atoi( _port.c_str() ) );
int remoteSize = sizeof(remote);

bytesRead = recvfrom(_os.socket, 
    (char*)buffer, 
    bufferSize, 
    0,(SOCKADDR*)&remote, &remoteSize);

_error = WSAGetLastError();

私が実行しているときbytesReadは、-1 と_error0 です。

4

2 に答える 2

2

WSAGetLastError()を返すときに0を返さないようにする必要がありrecvfrom()ますSOCKET_ERROR。これは、2つの呼び出しの間に、WinSockのエラーコードを読み取る前に間接的にクリアする何かを行っている可能性があることを示しています。

sockaddr_inちなみに、を呼び出す前に入力する必要はありませんrecvfrom()sockaddr_in送信者に関する情報が入力されます。recvfrom()実行する必要のある情報はすべて、SOCKET代わりにハンドルから取得されます。

于 2012-05-16T17:55:34.487 に答える
2

他に試してみることができるのは、getsockopt()withを呼び出してソケット固有のSO_ERRORエラーを確認することです(スレッドのソケットの最後のエラーに対して)。

于 2012-05-16T15:47:23.987 に答える