2012-01-05 19 views
3

良い日、UDP recv/recvfrom複数の送信者

Windows XPでは、UDPプロトコルを使用して通信するVC++のアプリケーションを開発しています。これまでは、ツールで受信したすべてのパケットが単一のターゲットからのものであると仮定できました。しかし、今私は放送を受けています。リスニングスレッドは、最小のオーバーヘッドを持っており、以下の行にその時間のすべてを費やす必要があります。

rv = recvfrom(socket, 
       p_buffer_p, 
       p_size, 
       0, 
       (sockaddr*)&clientService_in, //This is set to do a broadcast recv 
       &SenderAddrSize); 

私の質問は、私は私がのrecvfromから単一のリターンから取得バッファがシングルからであると仮定することができるかどうかではありませんターゲット。つまり、受信アプリでrecvfromから1回の返信を送信アプリで送信するように1回呼び出すのですか?または、複数の送信者からの複数の送信をまとめて1にすることはできますか?

ターゲットからの1回の送信がrecvfromからの複数の返信に分割されないと仮定しています。私はいつもこれを仮定していて、とにかく問題がなかった。

もう1つ、そのSOCK_DGRAMタイプのソケットです。

答えて

6

いいえ、UDPメッセージは分割できません。彼らは送られたときに到着します。また、複数のUDPメッセージは連結されません。

N sendtoメッセージはN個のrecvfrom呼び出しに対応します。 wikiから

引用:

データグラム - パケットは個別に送信され、それらが到着した場合にのみ 整合性がチェックされます。パケットは受信側で が受け入れられる明確な境界を持ちます。つまり、受信側の読み取り操作では、最初に送信されたメッセージ全体が返されます。

+0

よろしくお願いします。私は別の場所に投稿した記事を読んでいましたが、それは分割されてうまくいくかもしれないことを示していたようですが、これは別のプロトコルのためだと思います。私はまだwinsockの接続の違いに慣れていません。 – Ian

+0

@Ianこのプロトコルはおそらくストリームベースのプロトコル(TCP/SCTP) – INS

2

あなたはのrecvfromするための単一の呼び出しは()で最も 1つのUDPデータグラムを返すことが正しいです。 しかし、各データグラムが実際に到着するという保証はありません。

特に、送信するUDPデータグラムが大きすぎると、ネットワークレベル(断片化)で分割され、データグラムが破棄される可能性が高くなります全体の損失)。ネットワークレベルでパケットが再構築されるため、アプリケーションレベルで断片化が発生することはありません。

大きすぎるものがどれほど大きいかを事前に知ることは不可能なため、状況は非常に面倒です。見つけ出すためのさまざまなアルゴリズムがありますが、それらはすべて試行錯誤に値します。さらに、ファイアウォール、ルータ、およびオペレーティングシステムは、時間の経過とともに断片化されたデータグラムに向けて行動を変えることができます(しばしば行います)。特定のサイズまたは構成のパケットが、一部のファイアウォールルールに違反するため、常にドロップされるシナリオがあります。

sendto()は必ずrecvfrom()になり、データグラムを小さくしてください(1400バイト未満はかなり安全です、512バイト未満は非常に安全です)。

関連する問題