- ベストアンサー
WinSock32のTCP通信において、recvする前にどれだけの量がソケットにたまっているか調べる方法ってありますか?
タイトルのとおりなのですが、 WinSock32のTCP通信において、recvする前にどれだけの量がソケットにたまっているかを調べたいのですが、方法が見つかりません。 WinSock32の関数に用意されているのでしょうか? 関数名だけでもいいので教えていただけると助かります。 よろしくお願いいたします
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1&2です ん? 最初バッファに "ABCDE" があったとします。 ここで、 char buf[4096]; rb=recv(s,buf,sizeof(buf),MSG_PEEK); とやると rb=5 buf="ABCDE" バッファ="ABCDE" となります。 その後,"FGH"をsendしたとします。 (ここで、「相手は受信したデータをそのまま返す」とします) 次にrecvやるときには バッファには、"ABCDEFGH"があるはずです。 普通は、recv(s,buf,sizeof(buf),MSG_PEEK)の後に recv(s,buf,5,0)をやって"ABCDE"の読み込み&削除します こーいう意味じゃなくて??
その他の回答 (2)
- mssine
- ベストアンサー率24% (38/156)
#1です。 絶対に誤解を生む回答でしたので、再度回答します。 recvの第4引数にMSG_PEEKを指定すると、第3引数で示されたバイト数までのデータを受信し、且つ受信したデータをバッファから削除しません。 よって、バッファに何バイトたまっているかを正確に知るには、とっても大きなバッファを用意する必要あります。
お礼
ちょうどそのことについて質問しようと思っていました。 NULLじゃだめなんですね^^; わかりました、とっても大きなバッファを用意することにします。 2度も回答をありがとうございました。
補足
第4引数にMSG_PEEKを指定し受信したところ、確かにデータは残っていました。 ですが、その後にデータを送信しrecvしても、最初のデータだけしか読み取ることができませんでした。これはどういうことなのでしょうか? 一度お礼を申し上げたのに再び質問してしまいすみません。 よろしくお願いいたしますm(_ _)m
- mssine
- ベストアンサー率24% (38/156)
recvの4番目の引数にMSG_PEEKを指定すると、何バイトたまっているかが返ってきます
お礼
そういうことですか。ちょっと勘違いしていたようです。 分かりました、どうもありがとうございましたm(_ _)m