
このたびC言語でネットワークプログラミング(TCP)をしているのですが、気になったことがあったので、2点ほど質問させていただきます。
(1)WSock32のsendで一度に送信できる量は65535バイトと以前学んだのですが、受信側がrecvする前にどんどん65535バイト送信していったら受信側のソケットはどんどんいっぱいになってしまいますよね?その場合、限界はあるのでしょうか?また、一度にrecvできる量も65535バイトが限界なのでしょうか?もしそうだとしたら65535バイト以上データがあると取得しても残ってしまうんですか?
(2)sendで大きなデータなどを送信した場合、受信側でrecvしたときに途中までのデータを受信してしまったりすることってありますか?たとえば、「"abcde"と送信したのに対し、受信側でrecvしたらとりあえず"abc"まで受信し、次のrecvで残りのデータを受信する」様なことってあるんでしょうか?
すべてのデータがちゃんと送信されてからじゃないとrecvで取得することはできなくなっているんでしょうか…
とてもとても分かりにくい文章で本当にすみません。
すべてとはいいません、少しでも情報があれば教えていただけませんでしょうか・・・
どうぞよろしくお願いいたしますm(_ _)m
No.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" と分割と結合が両方行われて届くかもしれません。
ですので、送信側も、受信側も、こうしたことを考慮して作らなければなりません。
とても分かりやすい回答ありがとうございました。
限界の送信サイズ等は検証して調べてみることにします。
TCPはデータすべてが保障されているものだと思い込んでプログラムを組んでいたので、1から見直しですorz
No.1
- 回答日時:
一度に送信できるパケットの限界はあります。
しかしWinSock2のsendでは1メガのデータをいれても問題なく動作するはずです。
send内部でパケットが分割されるからです。
ただし巨大なデータ、例えば1ギガとか送信しようとすると
WSAEMSGSIZE(10040)が戻ります。
これはsend内部のバッファー不足というエラーです。
TCPというのは接続の最初に最初に相手がどれだけバッファがあるのか
という情報をお互いにやりとりします。
その為、それ以上のデータは送りません。
またTCPは相手にデータが届いた場合、「届いたよ」というのを
送り返しています。つまりどこまでデータが届いたかを送った側も把握しています。
>「"abcde"と送信したのに対し、受信側でrecvしたらとりあえず"abc"まで受信し、
>次のrecvで残りのデータを受信する」様なことってあるんしょうか?
あります。10回のsendで10回のrecvを期待するようなプログラムを組んではいけません。
返信遅れてすみません。わかりました。とても参考になりました。
これからはきちんとこれらのことを考慮してプログラムを組んで生きたいと思います。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Outlookの「受信日時」「件名」...
-
Windows Mobile6.1 メール受信...
-
TCP/IP のパケットの分断と結合...
-
VC++メッセージの送受信につい...
-
シリアル通信時のデータ受信方法
-
ASP.NET C#でPOST受信
-
recv関数の戻り値について
-
パソコンに詳しい方教えて下さ...
-
バッチファイルでディレクトリ...
-
ARCserveの復元方法
-
Windows上のファイル操作の履歴...
-
別のフォルダにファイルを移動...
-
隠しファイルとZip圧縮について
-
Zipファイルをエクセルに指定変...
-
指定ファイルをFTPで自動アップ...
-
Windows 7 標準のZip解凍が出来...
-
ipadで社内ネットワークに接続
-
java.lang.NumberFormatExcepti...
-
グローバルIPアドレスを取得し...
-
Lhaplusが発したと、みられるエ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Outlookの「受信日時」「件名」...
-
TCP/IP のパケットの分断と結合...
-
Outlookの「受信日時」「送信者...
-
UDP受信時の通信異常検知について
-
CRC-CCITTに関しての仕様とサン...
-
ASP.NET C#でPOST受信
-
recv関数の戻り値について
-
VB2010で、シリアル通信の方法...
-
HPのメールフォームについて
-
アンテナってあるでしょ?あれC...
-
シリアル通信時のデータ受信方法
-
赤外線通信
-
C#にてCTI。RS232Cの受信と送信...
-
受信処理の終了条件
-
PICを用いた赤外線通信
-
DHCPOFFERの受信について
-
VB2005でTCP/IPソケット通信で...
-
.NetのTimerについて
-
文字化け
-
winsockを使ったTCP及びUDP通信...
おすすめ情報