
linux で socket を使ってプログラムを作っております。
パケットの頭に、どんな種類のパケットかの情報を入れ、それに続く部分にデータを入れて送っております。受信側では、届いたパケットの頭の情報を見て必要な処理を行う、という流れになっております。
ところが、時々、次のような現象が発生して困っております。
・送信側で一回のsendで送ったはずのデータが受信側では一回のrecvで届かず、二回のrecvで届く。
・送信側では二回のsendで送ったつもりなのに、受信側では一回のrecvで2つのパケットが結合したデータが届く。
これはsendとrecvでは普通に起こると想定しなければならない現象なのでしょうか?
それとも、linuxマシンの設定に問題があるのでしょうか?
No.1ベストアンサー
- 回答日時:
>・送信側で一回のsendで送ったはずのデータが受信側では一回のrecvで届かず、二回のrecvで届く。
>・送信側では二回のsendで送ったつもりなのに、受信側では一回のrecvで2つのパケットが結合したデータが届く。
TCPは「ストリーム」なのでそういう動作をしても不思議ではない。
ということになります。
>それとも、linuxマシンの設定に問題があるのでしょうか?
Windowsでも普通に発生します。
http://www.ne.jp/asahi/hishidama/home/tech/socke …
send(送信)、recv(受信)や
http://www.ne.jp/asahi/hishidama/home/tech/socke …
等を参照…でしょうか。
# 他にもそういった解説をしているページはあるでしょう。
http://rgv250.dyndns.org/socket.htm
や
http://hp.vector.co.jp/authors/VA019876/sokrpg/d …
の「たまに、受信したレコードの最後が途中で切れていることがあります。どうしてでしょうか? 」とか…
No.3
- 回答日時:
それはTCPによる通信の特徴です。
TCPはバイトストリーム型のプロトコルですので、
流れてくるバイト列には一切の区切りがありません。
100バイト×10回で送信しても、500バイト×2回で送信しても、
あるいは999バイトと1バイトを連続して送信しても、
TCPにおいては同じ意味になります。
同様に1000バイトを受信する側も、
1000バイト×1回のrecvになることも、
500バイト×2回のrecvになることもあります。
このようなメッセージの境界を保証しないTCPの特性に対し、
メッセージ境界を保証するSCTPのようなプロトコルもあります。
No.2
- 回答日時:
>ところが、時々、次のような現象が発生して困っております。
>これはsendとrecvでは普通に起こると想定しなければならない現象なのでしょうか?
普通に起こる現象です。
sendとrecvは「sendとrecvが1対1になる保証はない」のです。
1000バイトsendしたら、1、1、998の3回に分けて届くかも知れないし、2000バイト送って1000バイト送ってと、3000バイトを2回にわけて送ったら、1450、1450、100と、3回に分かれて届くかも知れません。
なので、recvは「何回、何十回に分かれて届いても大丈夫なように受信」しなければなりません、パケットがピッタリサイズで届くとは限らないので、バッファリング処理も要ります。
受信処理では、途中で届かなくなった場合のタイムアウト処理も要ります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux Ubuntuサーバーでメールを受信できない 7 2022/08/23 20:55
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- Wi-Fi・無線LAN PCWi-Fiの設定方法がわからなくて困っています。 4 2022/12/28 18:30
- その他(コンピューター・テクノロジー) 「プロトコル」の定義について 5 2023/04/16 13:13
- メルカリ らくらくメルカリ便 スマホを送った 箱が3 cm 以上ありました ゆうパケットではだめ? 1 2023/02/08 23:32
- 郵便・宅配 【大至急!!】 CDをネットで注文したら、ゆうパケットで発送したというメールが来ました。 そして、「 3 2022/07/05 21:44
- 固定IP スマホやPCのIPアドレスについて教えてください。 5 2023/07/07 19:53
- その他(メールソフト・メールサービス) 複数のメールを送信した順と受信した順が違うのは何故? 4 2023/02/22 09:58
- 郵便・宅配 封筒の事で質問です。 皆さんおはようございます。 ケータイ補償サービスを使って、3日程前に新しい(同 1 2023/06/15 07:17
- 郵便・宅配 ネット通販で頼んだ商品が一向に届かずおかしいなと思って確認したところ、購入したショップへ返送されてい 3 2023/05/15 11:14
このQ&Aを見た人はこんなQ&Aも見ています
-
socket: recvはいつ,どれだけ受け取るのか?
C言語・C++・C#
-
UDPパケットの分割について
その他(インターネット接続・インフラ)
-
ソケット通信 同じポート番号でn対1はできない?
C言語・C++・C#
-
-
4
ネットワーク切断を検出するには?
C言語・C++・C#
-
5
recv関数の受信結果について
C言語・C++・C#
-
6
C# ソケット通信でデータ受信時の欠損について
C言語・C++・C#
-
7
TCP/IP通信時のパケット分割について、パケットがMTU以下なのになぜ分割されるの?
UNIX・Linux
-
8
UDP通信におけるbind関数について
C言語・C++・C#
-
9
ソケットのrecvの戻り値が0
C言語・C++・C#
-
10
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
11
winsockの非同期処理について
C言語・C++・C#
-
12
Socket通信の0バイト受信について
Java
-
13
IG、ACC、+B、ILL
国産バイク
-
14
UDP通信する時に、相手にどうやって自分のポート番号を教える?
Java
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
インストールできないですどう...
-
LinuxでWine使うとどのくらいWi...
-
Linuxでブートディスクの交換後...
-
Core 2 Duo の古いパソコンに最...
-
WineのRufusでデバイスを検知す...
-
CentOSが起動時にフリーズ
-
ubuntu 24 へのCanon 複合機ス...
-
ubuntuで デイスク/deb/loopと...
-
bashでシングルクォート内の変...
-
apacheでリバースプロキシを設...
-
Windowsのローカルディレクトリ...
-
Ubuntu on Xorgのログインについて
-
Ubuntuサーバーでメールを受信...
-
ログにserver reached MaxReque...
-
PCが常にBIOS画面が立ち上がっ...
-
Ububtuでファイル共有できない...
-
disktopのアイコン
-
Ubuntu でinvalid filenameとな...
-
Postfixでドコモメールに送信す...
-
gawk
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Outlookの「受信日時」「件名」...
-
TCP/IP のパケットの分断と結合...
-
UDP受信時の通信異常検知について
-
Outlookの「受信日時」「送信者...
-
C#にてCTI。RS232Cの受信と送信...
-
VC++メッセージの送受信につい...
-
recv関数の戻り値について
-
RS232cを用いた送信プログラム
-
メーラー
-
PC98で232c送信winndowで受信で...
-
「TCPは全二重可能」の意味
-
VBのMSCommコントロールを使っ...
-
シリアル通信時のデータ受信方法
-
WinSockとWinPcapについて
-
マルチスレッドに挑戦したい
-
VC++ 2010 メッセージが文字化...
-
ネットワークでの受信バイト数
-
無線LAN、SIFSについて
-
winsockを使ったTCP及びUDP通信...
-
DHCPOFFERの受信について
おすすめ情報