2011-12-15 9 views
1

をストリーミングするには、のは、UDPの送信者は、数回のSendTo実行されることを言ってみましょう:データが利用可能な場合読書UDPソケット:レコードまたは

 
sendto(s, buffer, 100, ...); 
sendto(s, buffer, 200, ...); 
sendto(s, buffer, 300, ...); 

レシーバは、次のコードを実行:今すぐ

 
void OnReceive() 
{ 
    recvfrom(s, buffer, 1000, ...); 
} 

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

100%正しいレシーバコードを書き込むには、種類のストリーム解析ロジックまたはデータ読み取りロジックを実装する必要がありますか?

この質問では、データが失われず、パケットの順序が変更されないと仮定しますが、一般的にUDPソケットでは正しくありません。 (例外は新しいLinux固有recvmmsg(2) APIである)、すなわちと仮定したパケットが並べ替えされていないとあなたがカーネルに与えるバッファが十分な大きされているキューにデータグラムUDPソケットデキューから

答えて

2

つの読み出しどんなに多くあります3回の読み込みで100,200,300バイトが得られます。

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

+0

また、パケットがドロップされないと仮定します。 –

+0

はい、それもありがとうございます。 –