1

UDP ソケットを使用して C で小さなアプリケーションを作成しており、次の recvfrom 関数を使用しています。

int recvfrom(int s, void *buf, int len, unsigned int flags struct sockaddr *from, socklen_t *fromlen); 

私のアプリケーションでは、さまざまなパケットを受信し、すべてのパケットを受信したことを確認したら、ループを使用していくつかのパケットを取得するため、この関数によってデータがどこから取得されるのか実際に疑問に思っています。

動作しているように見えます (運が良かったのかもしれません ;) が、ループ内で recvfrom を複数回呼び出してパケットを取得する前に、パケットがどこに格納されているかがよくわかりません。

どうぞよろしくお願いいたします。良い一日を!アレックス

4

2 に答える 2

4

それらは、カーネルの内部バッファーに保持されます。そのバッファがいっぱいになった場合 (つまり、アプリケーションが の呼び出しを停止した場合recvfrom)、カーネルはデータグラムのドロップを開始します。

sendtoとはどちらrecvfromも単なる凝っmemcpyた呼び出しであり、実際に何かを「送信」または「受信」するものではないことを理解することが重要です。Sendto はデータをカーネルにコピーし、カーネルはそれを実際にパケットなどに入れようとします。同様に、 を呼び出すrecvfromまでに、データはすでに受信されており、それをユーザー空間 buffer にコピーするrecvfromだけです。

于 2012-11-20T04:17:30.213 に答える
0

受信したすべてのパケットは、カーネル キューに格納されます。これは固定長のキューです。アプリケーションがパケットを受信しない場合、古いパケットを上書きします。そしてそのキューを更新します。したがって、 receivefrom を呼び出すたびに、利用可能な古いパケットが配信されます。

于 2012-11-20T05:52:59.950 に答える