このたび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で質問しましょう!
似たような質問が見つかりました
- その他(コンピューター・テクノロジー) 「プロトコル」の定義について 5 2023/04/16 13:13
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- その他(メールソフト・メールサービス) メールサーバーは「PC側がメールをDL済みか否か?」を何を以て感知するのか? 2 2022/12/20 14:56
- UNIX・Linux Ubuntuサーバーでメールを受信できない 7 2022/08/23 20:55
- ネットワーク OSI参照モデルの各層の役割がわかりません。 3 2023/04/21 21:12
- PHP a href リンクタグでだけで 送信が できちゃっています。 1 2022/04/18 04:25
- その他(悩み相談・人生相談) 自分が心配性すぎて苦しいです。 誰か、励ましてください、、、。 outlookアカウントについてです 7 2022/08/16 17:12
- docomo(ドコモ) +メッセージの送受信。 au(uq mobile)のデータ回線でdocomoの電話番号の+メッセージ 2 2022/09/14 16:09
- Bluetooth・テザリング WiFiデータ通信量の消費 3 2023/01/09 15:04
- 固定電話・IP電話・FAX 業務用ファックスについて 5 2022/09/28 19:08
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
へんな現象
-
研究室志望の提出文書
-
応用情報技術者試験の令和元年...
-
gccを行ってもexeファイルが生...
-
質問失礼します。 プログラム言...
-
Notepad++の関数リスト表示でC...
-
Windows formアプリで データグ...
-
Linux Cプログラミングを学ぶた...
-
トリプトファンってケト原性あ...
-
c言語
-
MACで動く実行ファイルをWindow...
-
C言語 列挙型(enum型)変数について
-
右ビットシフト
-
mallocについて
-
C言語 配列と関数の練習問題
-
Bitcoin、BTCはブロックチェー...
-
C++6.0でのresource.hについて
-
VisualStudio2022でC言語プログ...
-
大量のデータを読み込んで表示...
-
c言語
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Outlookの「受信日時」「件名」...
-
TCP/IP のパケットの分断と結合...
-
Outlookの「受信日時」「送信者...
-
CRC-CCITTに関しての仕様とサン...
-
シリアル通信時のデータ受信方法
-
Excxel vba でYahoo API で住所...
-
UDP受信時の通信異常検知について
-
recv関数の戻り値について
-
ASP.NET C#でPOST受信
-
RS232cを用いた送信プログラム
-
VC++メッセージの送受信につい...
-
PC98で232c送信winndowで受信で...
-
TCPのプログラミングで質問…と...
-
VBのMSCommコントロールを使っ...
-
「TCPは全二重可能」の意味
-
DHCPOFFERの受信について
-
VB2010で、シリアル通信の方法...
-
msgrcv( )で領域破壊?
-
シリアル通信
-
ネットワークでの受信バイト数
おすすめ情報