• ベストアンサー

WinSock プロトコルスタックバッファについて

開発環境 XP、VC2005、C/C++、WinSock WinSockでネットワークプログラミングをしています。 例えば、下記のようなコードでデータを送信するとします。 int send_byte = send(socket, buf, byte, 0) このとき、変数byteには1024が入っているとします。 上記のコードをループさせてデータを送信すると、 しばらくsend_byteには byteと同じ値1024が入っています。 でも、プロトコルスタックバッファが満杯になり、 send()が処理しきれなくなった場合に、 byteは1024なのに、send_byteが例えば500などになります。 つまり、中途半端に送信してしまいますよね。 これはWinSockの仕様だと思いますが、 できれば中途半端には送信したくないのです。 このように中途半端に送信しない方法はあるでしょうか? send()するまえにプロトコルスタックバッファの空きが調べられれば なんとかできそうな気もするのですが・・・。 よろしくおねがいします。

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

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

通常、送信側は、送信すべきデータが全て送信完了するまで、送り続けるのが、一般的なやりかたです。又、受信側は、データを受信したとき、送信側が、send単位で送ったとしても、それを、send単位ごとに、受信することは、あり得ません。従って、例えば、送り側が、1024byteを3回送信できたとしても、受信側は、1回の受信で、3×1024bytesを受け取ることもあれば、1回の受信で500bytesしか受け取らないこともあります。従って、送信側が送ったデータを、論理的なレコード単位(今回は1024bytes)に組み立てるのは、全て受信側の仕事になります。 従って、送り側で、きりのいい単位で送信できたとしても、受信側にとてみれば、細切れに送信された場合と、同じことをしなければなりません。 それでも、尚1回のsendで1024btes単位で送りたい理由は、何なのでしょうか。

tanishi0718
質問者

お礼

プロトコルスタックバッファの情報は、やはりプログラム側からは見えないのですね。 ちょっと、自分でも何がわからないのか、どうしたいのか、よくわからなくなりました・・・。 回答は締め切らせていただきます。 すみません。出直してきます・・・。

その他の回答 (1)

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.1

それは、send側が考える問題じゃなくてrecv側が最後まで受信するまで送信続けるんだから、気にするところでしょうか? netstatした結果を送信するようなクライアント作って稼働状況を監視するクライアント作る手段も考えられますが、そこまでする意味が有るかどうか?

tanishi0718
質問者

お礼

回答ありがとうございます。 その通りですよね。