2011-08-10 19 views
6

私は非常に多くのウェブサイトやチュートリアル(およびドキュメント)にアクセスしましたが、未回答の質問が1つあります。私が現在socket.receive(...)を実行していないときに、UDPパケットが到着するとどうなりますか? socket.receive(...)を呼び出すか、完全に失われるまで何とかバッファリングされますか?DatagramSocketからアクティブに受信していない場合、パケットはドロップされますか?

また、AndroidのDatagramSocket実装は、スレッドセーフであることを意味しています。これを聞くとソケットに書き込むことができますか?

答えて

9

カーネルネットワークスタックは、ソケットごとにの受信バッファを保持します。 setsockopt(2)システムコールの場合は、SO_RCVBUFオプションを使用してそのサイズを制御できます(Java APIが何であるか把握する必要があります)。

したがって、受信パケットは、そのバッファに十分なスペースがある限り、カーネルにキューイングされます。特定の瞬間にアプリケーションが「受信」機能を実行するためには、ではなく、が必要です。アプリケーションが十分な速さでパケットを待ち行列から外す(すなわち読み出す)ことができない場合、バッファはオーバーフローし、カーネルはパケットを廃棄し始める。 Linux(一般的にはUnix)では、netstat -sコマンドでパケットの廃棄数を確認できるはずです。

このバッファは、パケットがドロップされる唯一の場所ではありません。オンNICメモリに十分なスペースがない場合、ハードウェアによってパケットがドロップされる可能性があります。カーネルがビジー状態で、一般的なネットワーク入力キューを処理していない場合、デバイスドライバはパケットを破棄できます。あなたはこれに堂々とメッセージを送る必要があります。

TCPは、トータルシーケンシングと、必要であれば、再送信でこのすべてを回避しようとします。あなたが接続されたUDPソケット上の2番目のsend(2)からのエラーを受け取り、ICMPが正しく動作する場合のみを除いて、UDPは、あなたのために落としたパケットについては何もしません。

最終行は、パケットがバッファされているが、その時点まで廃棄されていることです。

+1

あなたへの誇り! Androidのドキュメントを確認しました。デフォルトのソケットバッファサイズは4098バイトです。これはソケットのコンセプトをより明確にします。 – LordTwaroog

関連する問題