- ベストアンサー
VC++2010 TCPIP通信の受信処理について
VC++2010 TCPIP通信の受信処理について質問させていただきました。 現在、VC++2010 MFCのダイアログ でアプリケーションを作成しています。 現在、TCPIP通信で、受信処理のプログラムの所になるんですが、 recv関数を使用してるんですが、この関数は相手側からメッセージが送信される・切断される の イベントが発生しないとrecv関数は終了しません。 ここで質問なんですが、この関数でタイムアウト時間を設けたいのですが どのようにしたら良いかわかりませんでしたので質問させていただきました。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>現在、VC++2010 MFCのダイアログ でアプリケーションを作成しています。 でしたら…CAsyncSocketクラス使ったらいかがです? http://msdn.microsoft.com/ja-jp/library/t7a47kk4%28v=vs.100%29.aspx http://msdn.microsoft.com/ja-jp/library/3tbz7kf5%28v=vs.100%29.aspx >recv関数を使用してるんですが、この関数は相手側からメッセージが送信される・切断される の >イベントが発生しないとrecv関数は終了しません。 ブロッキングモードでしたらそうなりますね。 # recv()をなんらかのメッセージハンドラ内で処理しているとウィンドウの移動とかに反応できなくなります。 ブロッキングモードでもselect()使って判別すれば…受信データが無いときにrecv()をコールしない。ということも可能でしょうか。 http://www.geekpage.jp/programming/winsock/select-with-timeout.php >ここで質問なんですが、この関数でタイムアウト時間を設けたいのですが >どのようにしたら良いかわかりませんでしたので質問させていただきました。 非ブロッキングモードにするのが一般的…でしょうかねぇ。 # CAsyncSocket使う…ということになります。検索すればサンプルくらい見つかるでしょう。 上記のselect()でもタイムアウトの設定ができるのでそちらを使う。というのもアリです。 ソケットオプションでタイムアウトが設定できたかも知れませんが。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms740476%28v=vs.85%29.aspx
その他の回答 (1)
- fresh_homepie
- ベストアンサー率64% (24/37)
(MFCのCAsyncSocketクラスではなく) Winsockを直接使うのであれば WSAAsyncSelect( ) による非同期ソケットを利用するのが一般的でしょう。 受信できる状態になったらウィンドウメッセージによる通知を受け取るので、その状態で recv( ) を呼び出せばブロックされることなくデータを取得することができます。