9

すべてのトラフィックを読み取るためにRAWソケットを作成するプログラムを作成しています。socket()とrecvfrom()の呼び出しの間(最後の呼び出しは、バッファーからすべてのパケットを取り出すためのループ内にあります)、5秒待ちます。

プログラムを実行すると、hping3コマンドを使用して«高速モード»(バッファを高速で埋めるため)で約200パケットをプログラムに送信します。5秒が経過するとすぐに、私のプログラムはバッファから約150パケットを抽出します。

より良い結果を得るために、受信バッファのサイズを変更しようとしています。

int a = 65535;
if ( (setsockopt(sockfd, 0, SO_RCVBUF, &a ,sizeof(int)) ) < 0 )
{
    fprintf(stderr, "Error setting sock opts..\n");
}

ただし、«a»、1、または10000000の値が何であれ、何も変わらないように見えます。それでも、バッファから最大150パケットを取得します。

どうしたの?

編集:«a»の値はgetsockopt呼び出しで確認されます。

4

2 に答える 2

17

それでも機能していないように見える場合は、OSによって制限されることもあります。次の値を確認してください。

/proc/sys/net/core/rmem_default
/proc/sys/net/core/rmem_max

例で言うようにTCPであり、実際にはrawソケットではない場合は、次の値を確認することもできます。

/proc/sys/net/ipv4/tcp_mem

これらのファイルでcatを実行すると、現在の設定が表示されます。それらを恒久的に変更するには、sysctlを使用します。変更を開始する前に、これらの設定を書き留めておくことをお勧めします。これらの変更を行うための優れたチュートリアルは次のとおりです:http://fasterdata.es.net/fasterdata/host-tuning/linux/

于 2012-04-08T15:04:12.610 に答える
12

level引数は、ではなく、でsetsockoptある必要があります。SOL_SOCKET0

int a = 65535;
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &a, sizeof(int)) == -1) {
    fprintf(stderr, "Error setting socket opts: %s\n", strerror(errno));
}
于 2012-04-08T14:38:21.640 に答える