1

UDP 送信者が sendto を数回実行するとします。

sendto(s、バッファ、100、...);
sendto(s、バッファ、200、...);
sendto(s、バッファ、300、...);

受信者は、データが利用可能になると次のコードを実行します。

void OnReceive()
{
    recvfrom(s、バッファ、1000、...);
}

recvfrom が呼び出されたときにすべてのデータ (100+200+300) が利用可能である場合、1 回の recvfrom 呼び出しまたは予測できないサイズの複数回の recvfrom 呼び出しで読み取られる可能性はありますか? それとも、送信されたのと同じ部分で常に受信されます: 100、200、300?

100% 正しいレシーバー コードを作成するには、ストリーム解析ロジックやデータ レコード読み取りロジックを実装する必要がありますか?

この質問では、データが失われておらず、パケットの順序が変更されていないと仮定していますが、一般的に、これは UDP ソケットでは正しくありません。

4

1 に答える 1

2

UDPソケットから1回読み取ると、キューにあるデータグラムの数に関係なく1つのデータグラムがデキューされます(新しいLinux固有のrecvmmsg(2)APIを除く)。つまり、パケットが並べ替えられておらず、カーネルに提供するバッファーが十分に大きいと仮定すると、100を取得します。 3回の読み取りで200バイトと300バイト。

UDPアプリケーションは通常、レコード指向です。

于 2011-12-15T19:57:55.060 に答える