2012-04-08 26 views
6

私はすべてのトラフィックを読み込むためにRAWソケットを作成するプログラムを作っています。 socket()とrecvfrom()の呼び出しの間に(最後のものはバッファからすべてのパケットを取り出すループにあります)私は5秒待ちます。なぜSO_RCVBUFの値を変更できないのですか?

私はプログラムを実行すると、高速モードでは(バッファをすばやく書き込むために)hping3コマンドを使って約200パケットをプログラムに送信します。 5秒が経過すると、私のプログラムはバッファから約150パケットを抽出します。 〜何も、私はまだ入手変化しないようで、しかし

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

、«»、1または10000000の値が何であれ:

は、私はより良い結果を得るために、受信バッファのサイズを変更してみてくださいバッファから150パケット。

問題が何ですか?

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

+0

'socket()'などの関連する呼び出しを含め、もっとコードを表示できますか?ご使用のオペレーティングシステムがわかっているかもしれません。 –

+0

もちろん、私はこのプログラムをLinux 3.2 64ビットで実行しています。 'socket()'の呼び出し: 'sockfd = socket(AF_INET、SOCK_RAW、IPPROTO_TCP)' – Flow

答えて

7

level引数がSOL_SOCKET、ない0次のようになります。

int a = 65535; 
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &a, sizeof(int)) == -1) { 
    fprintf(stderr, "Error setting socket opts: %s\n", strerror(errno)); 
} 
+0

ありがとうございます。しかし、受信バッファの制限は262142であり、パケットが50バイトのサイズであれば、メモリには約5200パケットが存在し、150パケットだけでなく、 – Flow

+0

(解決済み、下記参照) – Flow

13

それはまだ動作していないようです場合にも、OSによって制限される場合があります。値を確認してください:あなたはこれらの上で猫を実行した場合

/proc/sys/net/ipv4/tcp_mem 

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

それは実際に生のソケットではありません、あなたの例で言うようにTCPだ、とした場合、あなたはまたの値を確認することができますファイルには、現在の設定が表示されます。それらを永久に変更するには、sysctlを使用してください。変更を開始する前に、これらの設定を書き留めることをお勧めします。これらの変更を行う上での参考になるチュートリアルはhttp://fasterdata.es.net/fasterdata/host-tuning/linux/です。

+0

ありがとう、私はrmem_max値を増やしました。それは非常にうまく動作し、すべてのパケットを取得できます。 – Flow

+0

あなたはこの値を確認できるウィンドウについて考えていますか? – sreepurna

関連する問題