• ベストアンサー

WinSock32のTCP通信において、recvする前にどれだけの量がソケットにたまっているか調べる方法ってありますか?

タイトルのとおりなのですが、 WinSock32のTCP通信において、recvする前にどれだけの量がソケットにたまっているかを調べたいのですが、方法が見つかりません。 WinSock32の関数に用意されているのでしょうか? 関数名だけでもいいので教えていただけると助かります。 よろしくお願いいたします

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

  • ベストアンサー
  • mssine
  • ベストアンサー率24% (38/156)
回答No.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"の読み込み&削除します こーいう意味じゃなくて??

genki140
質問者

お礼

そういうことですか。ちょっと勘違いしていたようです。 分かりました、どうもありがとうございましたm(_ _)m

その他の回答 (2)

  • mssine
  • ベストアンサー率24% (38/156)
回答No.2

#1です。 絶対に誤解を生む回答でしたので、再度回答します。 recvの第4引数にMSG_PEEKを指定すると、第3引数で示されたバイト数までのデータを受信し、且つ受信したデータをバッファから削除しません。 よって、バッファに何バイトたまっているかを正確に知るには、とっても大きなバッファを用意する必要あります。

genki140
質問者

お礼

ちょうどそのことについて質問しようと思っていました。 NULLじゃだめなんですね^^; わかりました、とっても大きなバッファを用意することにします。 2度も回答をありがとうございました。

genki140
質問者

補足

第4引数にMSG_PEEKを指定し受信したところ、確かにデータは残っていました。 ですが、その後にデータを送信しrecvしても、最初のデータだけしか読み取ることができませんでした。これはどういうことなのでしょうか? 一度お礼を申し上げたのに再び質問してしまいすみません。 よろしくお願いいたしますm(_ _)m

  • mssine
  • ベストアンサー率24% (38/156)
回答No.1

recvの4番目の引数にMSG_PEEKを指定すると、何バイトたまっているかが返ってきます