2012-04-08 14 views
6

Tüm trafiği okumak için bir RAW yuvası oluşturan bir program yapıyorum. Soket() ve recvfrom() çağrısı arasında (sonuncusu tüm paketleri tampondan çıkarmak için bir döngüdür) 5s bekliyorum.SO_RCVBUF değeri neden değiştirilmiyor?

Programı çalıştırdığım zaman, programa "hızlı modda" (tamponda hızlıca doldurmak için) hping3 komutuyla yaklaşık 200 paket gönderiyorum. 5s geçtikten sonra, programım tampondan yaklaşık 150 paket çıkarır. ~ Hiçbir şey, hala olsun değiştirir gibi görünüyor, ancak

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

, «a», 1 veya 10000000 değeri ne olursa olsun:

daha iyi sonuç almak için alma tampon boyutunu değiştirmek için denemek Tampondan 150 paket.

Sorun nedir?

Düzenleme: «a» değeri, bir getsockopt çağrısı ile doğrulanır.

+0

Bize 'socket() 'vb ilgili aramalar dahil olmak üzere daha fazla kod gösterebilir misiniz? İşletim sisteminizi bilmemize izin vermek de yardımcı olabilir. –

+0

Elbette, bu programı Linux 3.2 64 bitleri altında çalıştırıyorum. Socket() ':' sockfd = socket (AF_INET, SOCK_RAW, IPPROTO_TCP) ' – Flow

cevap

7

setsockopt için level argüman SOL_SOCKET değil 0 olmalıdır: Ayrıca işletim sistemi tarafından sınırlı olabilir

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

'a yapılan çağrı Teşekkür ederim, şu anda değer değişikliklerini iyi çalışıyor. Bununla birlikte, alma arabelleği limiti 262142'dir ve bir paket 50 bayt boyutundaysa, bellekte yaklaşık 5200 paket olmalı ve sadece 150 değil? – Flow

+0

(çözüldü, aşağıya bakın) – Flow

13

, hala çalışıyor gibi görünmüyor eğer. Eğer örnekte demek gibi, TCP ise

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

değil, aslında bir ham soket, ayrıca değerleri kontrol edebilirsiniz: değerleri kontrol edin

/proc/sys/net/ipv4/tcp_mem 

bu ölçütler üzerinde kedi çalıştırırsanız dosyalar size mevcut ayarları gösterir. Onları kalıcı olarak değiştirmek için sysctl kullanın. Bu ayarları değiştirmeye başlamadan önce bu ayarları yazmak iyi bir fikirdir. İşte bu değişiklikleri yapmak için harika bir öğretici: http://fasterdata.es.net/fasterdata/host-tuning/linux/.

+0

Teşekkür ederim, rmem_max değerini artırdım ve çok iyi çalışıyor, tüm paketleri alabilirim. – Flow

+0

Bu değerleri kontrol edebileceğimiz pencereler hakkında bir fikrin var mı? – sreepurna

İlgili konular