2012-04-08 18 views
6

Sto creando un programma che crea un socket RAW per leggere tutto il traffico. Tra la chiamata di socket() e recvfrom() (l'ultima è in un ciclo per estrarre tutti i pacchetti dal buffer) aspetto 5s.Perché la modifica del valore di SO_RCVBUF non funziona?

Quando eseguo il programma, invio circa 200 pacchetti con il comando hping3 in «modalità più veloce» (per riempire il buffer velocemente) al mio programma. Non appena sono trascorsi 5 secondi, il mio programma estrae circa 150 pacchetti dal buffer.

cerco di cambiare la dimensione del buffer di ricezione per ottenere un risultato migliore:

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

Tuttavia, qualunque sia il valore di «un», 1 o 10000000, a quanto pare non cambia nulla, ho ancora ottenere ~ 150 pacchetti dal buffer.

Qual è il problema?

Modifica: il valore di «a» viene verificato con una chiamata getsockopt.

+0

Puoi mostrarci altro codice, comprese le chiamate rilevanti a 'socket()' ecc.? Facendoci sapere che anche il tuo sistema operativo potrebbe aiutarti. –

+0

Certo, eseguo questo programma su Linux 3.2 a 64 bit. La chiamata a 'socket()': 'sockfd = socket (AF_INET, SOCK_RAW, IPPROTO_TCP)' – Flow

risposta

7

La level argomento setsockopt dovrebbe essere SOL_SOCKET, non 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

Grazie, funziona bene il valore cambia ora. Tuttavia il limite del buffer di ricezione è 262142 e se un pacchetto ha una dimensione di 50 byte, allora ci dovrebbero essere circa 5200 pacchetti in memoria e non solo 150? – Flow

+0

(risolto, vedi sotto) – Flow

13

Si può anche essere limitato dal sistema operativo, se ancora non sembra funzionare. Controllare i valori in:

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

Se è TCP come dici nel tuo esempio, e in realtà non un raw socket, si può anche verificare i valori in:

/proc/sys/net/ipv4/tcp_mem 

se si esegue gatto su queste i file mostreranno le impostazioni correnti. Per cambiarli in modo permanente, usa sysctl. È una buona idea scrivere queste impostazioni prima di iniziare a cambiare le cose. Ecco un ottimo tutorial su come apportare queste modifiche: http://fasterdata.es.net/fasterdata/host-tuning/linux/.

+0

Grazie anche a te, ho aumentato il valore di rmem_max e funziona molto bene. Posso ottenere tutti i pacchetti. – Flow

+0

Hai qualche idea di Windows, dove possiamo controllare questi valori? – sreepurna