0

winsockのsendto()メソッドを使用してUDPを使用してサーバーアプリケーションにデータを送信するクライアントアプリケーションがあります。私のクライアントアプリケーションでは、たとえば5クイックを作成しますsendto()。私のサーバーアプリケーションでは、たとえば10秒待ってから、とを実行しselect()ますrecvfrom()recvfrom()クライアントから送信された最初のパケットを教えてくれますか、それとも任意のパケット(最初に到着したパケット)ですか?それでも他の4つのデータパケットを取得できますか、それともwinsockのUDPフレームワークは1つだけをバッファリングしますか?

4

3 に答える 3

2

recvfrom()は、クライアントから送信された最初のパケットを私に提供しますか、それとも任意のパケットになりますか?

UDPは並べ替えを処理しないため、任意のメッセージを取得できます。メッセージは4つ未満、またはそれ以上になる可能性があります(ただし、今日ではまれです)。

于 2012-04-10T18:30:26.077 に答える
1

妥当なサイズの5つのパケットを使用すると、おそらくすべてのパケットを取得し、最初のパケットを最初に送信することになります。ただし、それらは故障している可能性があり、到着しない可能性があり、到着した場合は元のデータが含まれていない可能性があります。そのすべてをUDPで自分で処理する必要があります。(ただし、アプリケーションと要件、およびネットワークの安定性によっては、実際の問題ではない場合があります。99%のデータの受信が完全に正常である特定の状況が存在する可能性は確かにあります)。

于 2012-04-10T18:32:17.850 に答える
1

UDPはパケットの受信順序を保証しません。したがって、基本的に、最初のパケットは送信した最初のパケットであるrecvfrom() 可能性がありますが、そうではありません。これがTCPの目的です(受信データの順序を保証します)。パケットが転送中に失われた場合、パケットの一部(またはそれに関してはいずれか)をまったく受信しない可能性があります。

2番目の部分:通常、オペレーティングシステムは一定量のパケットをバッファリングします。これは、UDPソケット用に設定されたソケットバッファに依存します。バッファはすべてのソケットに固有であり、ソケット間で共有されません。Windowsでは、バッファのサイズを取得する方法がわかりません。Linuxでは、「/ proc / sys / net / ipv4/udp_mem」を確認してください。通常、そこには5つのUDPパケットを簡単に収めることができます。

于 2012-04-10T18:33:02.523 に答える