掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
WSAAsyncSelectでsendがブロックする事はありますか? (ID:71684)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
ノンブロッキングならば… send()でブロックすることはない…かと思われます。 # ブロックしないとならない状況であれば、SOCKET_ERROR が返され、 # WSAGetLastError()でWSAEWOULDBLOCKが返されるでしょう。 あとは…Socketの送信バッファより大きいデータをsend()しようとした場合にブロックされるかも知れません。 # send()したのに相手がrecv()で受け取ってくれない状況…だと、 # どこかでデータが詰まるコトになろうかと。 # 相手のSocketの(recv()で渡される前の)受信バッファとこちらの送信バッファの合計を上回った場合…でしょうかね。 # 実験したことはありませんが。 私のプログラムでは圧倒的に受信データの方が多いので…。 send()に失敗する。ということはあまり深く対処していません。 # 念のためWSAEWOULDBLOCKは対策していますが…送信できないと呼び出し元に戻らない…という風になってます。 # 一度だけ報告のあったCPU使用率100%はここなのかなぁ… >例えばサーバープログラムのFD_READでデータを受信した直後に、 >そのデータを送り返すとしたら、send処理は何処に書いたらいいのでしょうか? 受信データのサイズによるかと。 socketの送信バッファをサイズを越えないことが保証できるなら、recv()の直後でもイイでしょうし、 recv()したデータをある程度バッファして細々とsend()していくのもよいでしょう。 # バッファリングした場合、「リアルタイム」というわけには行かないかも知れませんが。 # 数十〜数百msとかの遅延が出るかも知れない…と。 # まぁ、TCPでそんなに時間にこだわってもしょうもないとは思いますが。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.