2012-04-08 20 views
6

Estoy haciendo un programa que crea un socket RAW para leer todo el tráfico. Entre la llamada de socket() y recvfrom() (la última está en un bucle para sacar todos los paquetes del buffer) espero 5s.¿Por qué cambiar el valor de SO_RCVBUF no funciona?

Cuando ejecuto el programa, envío alrededor de 200 paquetes con el comando hping3 en «modo más rápido» (para completar el búfer rápidamente) a mi programa. Tan pronto como 5s hayan transcurrido, mi programa extraerá aproximadamente 150 paquetes del buffer.

trato de cambiar el tamaño del búfer de recepción para obtener un mejor resultado:

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

Sin embargo, cualquiera que sea el valor de «a», 1 ó 10000000, parece que nada cambia, sigo teniendo ~ 150 paquetes del buffer.

¿Cuál es el problema?

Editar: El valor de «a» se verifica con una llamada getsockopt.

+0

¿Puede mostrarnos más código, incluidas las llamadas relevantes a 'socket()', etc.? También nos puede ayudar saber su sistema operativo. –

+0

Claro, ejecuto este programa bajo Linux 3.2 64bits. La llamada a 'socket()': 'sockfd = socket (AF_INET, SOCK_RAW, IPPROTO_TCP)' – Flow

Respuesta

7

El argumento level a setsockopt debe ser SOL_SOCKET, no 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

Gracias, funciona bien, el valor cambia ahora. Sin embargo, el límite del búfer de recepción es 262142 y si un paquete tiene un tamaño de 50 bytes, entonces debería haber aproximadamente 5200 paquetes en memoria y no solo 150? – Flow

+0

(resuelto, ver abajo) – Flow

13

También puede ser limitado por el sistema operativo, si es que todavía no parece estar funcionando. Compruebe los valores de:

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

Si se trata de TCP como usted dice en su ejemplo, y no es realmente un conector directo, también puede comprobar los valores en:

/proc/sys/net/ipv4/tcp_mem 

Si ejecuta gato en estos archivos que le mostrarán la configuración actual. Para cambiarlos permanentemente, use sysctl. Es una buena idea escribir estas configuraciones antes de comenzar a cambiar las cosas. Aquí hay un gran tutorial sobre cómo hacer esos cambios: http://fasterdata.es.net/fasterdata/host-tuning/linux/.

+0

Gracias también, he aumentado el valor de rmem_max y funciona muy bien, puedo obtener todos los paquetes. – Flow

+0

¿Tiene alguna idea sobre Windows, donde podemos verificar estos valores? – sreepurna

Cuestiones relacionadas