2016-12-18 10 views
0

私は基本的なチャットプログラムを作っていますが、問題があります。 recv(socket、buf、buflen、0)がC++で非同期であるかどうか尋ねたがっていますか?私はwhileループでそれを使用しており、サーバーがクライアントにデータを送信しない限りループをブロックします。C++ recv非同期サーバー - クライアント

答えて

0

ソケットは、デフォルトでブロッキングI/Oをでブロックします。 ノンブロッキングI/Oを使用する場合は、Windowsではioctlsocket(FIONBIO)、他のプラットフォームではfcntl(O_NONBLOCK)を使用して明示的に有効にする必要があります。呼び出し側をブロックする場合は、検出可能なエラー((WSA)EWOULDBLOCKEAGAINEINPROGRESSなど)でI/O操作が失敗し、後で操作を繰り返すことができます。

または、select()または(e)poll()を使用して、読み取り/書き込み可能な状態になるのを待ってから、読み取り/書き込み操作をブロックします。または、一部のプラットフォームでは、setsockopt()を使用して、読み取り/書き込み操作をブロックするためにSO_RCVTIMEO/SO_SNDTIMEOのタイムアウトを有効にすることができます。

あなたは非同期代わりに、I/Oを(動作を開始し、それがバックグラウンドで完了し、その後終了したときに通知し)たい場合は、別のワーカースレッドへのI/Oを移動するか持っている、またはWindows上のオーバーラップI/OおよびI/O完了ポートをサポートする拡張ソケット関数(ConnectEx()WSARecv()WSASend()など)を使用できます。

関連する問題