0

私は C++ と C でテスト アプリケーションを持っています。クライアントは、サーバーが送信した最後の番号でサーバーを絶えず攻撃しています。サーバーがこれらのパケットの 1 つを受信すると、番号が 1 増加し、新しい番号がクライアントに送信されます。何が起こるかというと、クライアントとサーバーの両方が実行されているローカル マシン上で、クライアントは常にサーバーの 1 桁後ろにあるということです。これは完全に予想されることです。

これは、recvfrom と sendto が 9328 バイトのパケットを予期して送信する場合は問題ありませんが、パケットのサイズを 256 に落とすと、クライアントが 44 バイトのパケットを送信し、サーバーが 256 バイトを予期する場合、クライアントは常に 33 カウント同期されません。クライアントは常に 212 カウント同期されず、同じマシン上で必ず失敗しません。

LAN IP アドレスを使用してこれらのパケットを送信しています。クライアントとサーバーは同じマシン上にあり、それぞれポート 3000 と 2000 をリッスンしています。

クライアントはサーバーでできるだけ速くパケットを送信します。サーバーは、パケットを受信したときに、更新されたカウントのみをクライアントに送信します。

興味深いことに、クライアントを閉じても、サーバーはクライアントが送信したパケットを処理しているため、これは OS の爆撃保護または Windows が多数の小さな UDP パケットを 1 つの 9328 バイト UDP パケットにグループ化していると推測しています。

これを起こさずに 256 バイト未満のパケットを送信するにはどうすればよいですか? パケットの移動中にパケットの断片化をできる限り回避したいので、特定のハードウェアに出入りするときに小さなサイズを維持する必要があります。

4

1 に答える 1

0

これらの 3 行は、パケット バッファのサイズを 0 に設定して無効にします。

const int size = 0;
setsockopt( sd, SOL_SOCKET, SO_SNDBUF, ( const char * )&size, sizeof( int ) );
setsockopt( sd, SOL_SOCKET, SO_RCVBUF, ( const char * )&size, sizeof( int ) );

これを行うと、パケットは受信後に保存されないことを意味することに注意してください。そのため、受信側が十分にリッスンしていない場合、パケットが失われる可能性が高くなります。

于 2013-09-25T22:17:57.307 に答える