0

MSDN は次のコードを提供します。

    int iResult;
    // Receive until the peer closes the connection 
    do { 

        iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0); 
        if ( iResult > 0 ) 
            printf("Bytes received: %d\n", iResult); 
        else if ( iResult == 0 ) 
            printf("Connection closed\n"); 
        else 
            printf("recv failed: %d\n", WSAGetLastError()); 

    } while( iResult > 0 ); 

iResult は受信したバイト数を保存します! 私の場合、何も受信されなかった場合(または終了に達した場合)に受信がハングするため、このようにすることはできません->したがって、終了条件が一致しません!

何か問題があるか、recv がここでハングするのはなぜですか?

あいさつ

4

3 に答える 3

3

これは、ソケットがデフォルトでブロックされているためです。これは、recv何かが受信されるまで eg の呼び出しがブロックされることを意味します。関数を使用ioctlsocketして、ソケットをノンブロッキングにすることができます。

受信できるものがない場合にエラーrecvで返されるように準備する必要があります。または、受信できるデータがあるかどうかを知るWSAEWOULDBLOCKなどのポーリング機能を使用します。selectポーリングしたくない場合は、MSDN で「非同期ソケット」を検索して、サーバーとクライアントの両方の例を見つけてください。

于 2013-09-17T13:17:38.937 に答える
0

何も受信されなかった場合、受信がハングします

正しい。

(または終わりに達した)

正しくない。その状況ではゼロを返します。ただし、「最後に到達した」ということは、ピアが接続を閉じたことを意味します。他の定義を念頭に置いている可能性がありますか?

あなたの問題は、ピアが接続を閉じておらず、まだゼロを期待していることだと思います。そのようには機能しません。

于 2013-09-17T22:06:56.357 に答える
0

実際には、受信データがソケットにない場合、recv はデータが到着するまでブロックします。select()を使用して、さらにデータが到着するタイミングを判断し、recv() を使用してそれを読み取ることができます。

于 2013-09-17T13:21:55.080 に答える