プロが教える店舗&オフィスのセキュリティ対策術

このたびC言語でネットワークプログラミング(TCP)をしているのですが、気になったことがあったので、2点ほど質問させていただきます。

(1)WSock32のsendで一度に送信できる量は65535バイトと以前学んだのですが、受信側がrecvする前にどんどん65535バイト送信していったら受信側のソケットはどんどんいっぱいになってしまいますよね?その場合、限界はあるのでしょうか?また、一度にrecvできる量も65535バイトが限界なのでしょうか?もしそうだとしたら65535バイト以上データがあると取得しても残ってしまうんですか?

(2)sendで大きなデータなどを送信した場合、受信側でrecvしたときに途中までのデータを受信してしまったりすることってありますか?たとえば、「"abcde"と送信したのに対し、受信側でrecvしたらとりあえず"abc"まで受信し、次のrecvで残りのデータを受信する」様なことってあるんでしょうか?
すべてのデータがちゃんと送信されてからじゃないとrecvで取得することはできなくなっているんでしょうか…

とてもとても分かりにくい文章で本当にすみません。
すべてとはいいません、少しでも情報があれば教えていただけませんでしょうか・・・
どうぞよろしくお願いいたしますm(_ _)m

A 回答 (2件)

> (1)


> その場合、限界はあるのでしょうか?
あります。
限界まで到達すると、send関数がブロックされるはずです(つまり、送信側が受け取るまで、send関数から戻ってこなくなる)。

> また、一度にrecvできる量も65535バイトが限界なのでしょうか?
これはちょっと分かりません。ですが、sendがもし本当に65535が限界でしたら、recvもそうかもしれませんね。

> もしそうだとしたら65535バイト以上データがあると取得しても残ってしまうんですか?
もしそうならば、残るでしょう。
それに限らず、65535よりも少ないデータしかなくても残るかもしれません。

> (2)
> 受信側でrecvしたときに途中までのデータを受信してしまったりすることってありますか?
あります。
複数回sendしたものを一度のrecvで受け取ることもあります。

> たとえば、「"abcde"と送信したのに対し、受信側でrecvしたらとりあえず"abc"まで受信し、次のrecvで残りのデータを受信する」様なことってあるんでしょうか?
あります。

> すべてのデータがちゃんと送信されてからじゃないとrecvで取得することはできなくなっているんでしょうか…
そのような仕組みはありません。

TCPは、送った順番は保証されますが、
送ったデータは途中で分割されたり結合されたりします。

"abc" "def" と2つのデータを送信したら、
受信側は
"abcdef"と結合されて届くかもしれませんし、
"ab" "c" "de" "f" と分割されて届くかもしれませんし、
"ab" "cd" "ef" と分割と結合が両方行われて届くかもしれません。

ですので、送信側も、受信側も、こうしたことを考慮して作らなければなりません。
    • good
    • 0
この回答へのお礼

とても分かりやすい回答ありがとうございました。
限界の送信サイズ等は検証して調べてみることにします。
TCPはデータすべてが保障されているものだと思い込んでプログラムを組んでいたので、1から見直しですorz

お礼日時:2005/10/24 22:56

一度に送信できるパケットの限界はあります。


しかしWinSock2のsendでは1メガのデータをいれても問題なく動作するはずです。
send内部でパケットが分割されるからです。
ただし巨大なデータ、例えば1ギガとか送信しようとすると
WSAEMSGSIZE(10040)が戻ります。
これはsend内部のバッファー不足というエラーです。

TCPというのは接続の最初に最初に相手がどれだけバッファがあるのか
という情報をお互いにやりとりします。
その為、それ以上のデータは送りません。
またTCPは相手にデータが届いた場合、「届いたよ」というのを
送り返しています。つまりどこまでデータが届いたかを送った側も把握しています。

>「"abcde"と送信したのに対し、受信側でrecvしたらとりあえず"abc"まで受信し、
>次のrecvで残りのデータを受信する」様なことってあるんしょうか?

あります。10回のsendで10回のrecvを期待するようなプログラムを組んではいけません。
    • good
    • 0
この回答へのお礼

返信遅れてすみません。わかりました。とても参考になりました。
これからはきちんとこれらのことを考慮してプログラムを組んで生きたいと思います。ありがとうございました。

お礼日時:2005/10/24 22:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!