• ベストアンサー

ソケットプログラミングのrecv時にFD_READイベントが終わらない

現在Winsockを用いているのですが、クライアントからのデータを受信したときにおこるFD_READイベントをWSAWaitForMultipleEventで受け取って処理しているのですが、recvからの戻り値が常に0にも関わらずFD_READイベントが発生し続けます。クライアント側での送信は成功しています。 このような事態が発生する原因としてはどのようなことが考えられますでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • i-kujou
  • ベストアンサー率50% (13/26)
回答No.1

正式な資料にあたったわけではないですが、recvの戻り値が0ということはコネクションが切断されているということですから、closesocketしない限りずっと「切断されている」という受信イベントが立って、FD_READが発生するのではないでしょうか?

bh5375
質問者

お礼

ご返答ありがとうございました。自己解決いたしました。 どういった状況であったかだけ説明させていただきますと、自身の作成し た送受信処理クラスにおいてrecv時のバッファサイズをメンバ変数に持た せていたのですが、その変数が「0」で初期化されていたままでした。 その変数はオーバーライドされたコンストラクタで任意の値に設定できる ようにしてあるのですが、それを行っていませんでした。つまりクラスの インスタンスが作成されていただけで安心していたわけです。 その結果、recvで受信するデータのサイズが0バイトということになって おり、受信可能データが全く減らないということになりFD_READイベント がなくなることもなく無限ループになっていたという落ちでした。 しかしrecvにこのような落とし穴というか、あくまで私自身が気づきに くいケースに遭遇できたという点で勉強になりました。