有効なアドレスの recvfrom api を呼び出しています。ここで、サイズ 9600 バイトのデータを読み取ろうとしています。サイズ 12KB のバッファを提供しましたが、select read イベントも取得していません。厳しい推奨MTUサイズでも1.5KBですが、4KBのパケットを送受信できています。
私は開発にアンドロイド NDK (Linux) を使用しています。
助けてください 。大きなバッファを読み取るために設定する必要があるソケットオプションはありますか?
MTU より大きいパケットを送信すると、断片化されます。つまり、それぞれが MTU 内に収まる小さな断片に分割されます。これに関する問題は、これらの断片の 1 つでも失われると (セルラー接続ではかなりの可能性があります...)、パケット全体が効果的に消失することです。
これに該当するかどうかを判断するには、接続の一方 (または両方) でパケット スニファーを使用する必要があります。PC 側では Wireshark を、Android 側では tcpdump を選択することをお勧めします (root が必要です)。ホームルーターはフラグメント化されたパケットを再構成する可能性があることに注意してください。これは、ホームルーター/ファイアウォール内からパケットをスニッフィングしている場合、すべてのフラグメントがルーターに到着するまでフラグメントが到着しない可能性があることを意味します (明らかに一部が取得されている場合)失われた場合、これは起こりません)。
もちろん、より良いオプションは、MTU よりも小さいパケットを常に送信していることを確認することです。断片化が正しいことであるということはほとんどありません。MTU は、サーバーとクライアントの間のパスに沿ったさまざまなホップで異なる可能性があることに注意してください。1500 より少し小さい一般的な選択 (1400 が安全なはずです) を使用するか、MTU を設定してプローブを試みることができます。 UDP パケットの検出フラグ( 経由) と、常にのオプションIP_MTU_DISCOVER
によって返される値よりも少ない値を送信します (再送信を含む!)getsockopt
IP_MTU