socket sockaddr program how accept c linux sockets listen

sockaddr - socket tcp in c



listen() ignora el argumento de retraso? (2)

Tengo el siguiente problema:

Tengo sockfd = socket(AF_INET, SOCK_STREAM, 0)

Después de configurar y enlazar el socket (digamos con sockfd.sin_port = htons(666) ), lo hago de inmediato:

listen(sockfd, 3); sleep(50); // for test purposes

Estoy durmiendo durante 50 segundos para probar el argumento de retraso, que parece ser ignorado porque puedo establecer una conexión * más de 3 veces en el puerto 666.

*: Lo que quiero decir es que obtengo un syn / ack para cada Nth SYN (n> 3) enviado desde el cliente y colocado en la cola de escucha, en lugar de ser descartado. ¿Qué podría estar mal? He leído las páginas man de listen (2) y tcp (7) y he encontrado:

El comportamiento del argumento de retraso en los sockets TCP cambió con Linux 2.2. Ahora especifica la longitud de la cola para los sockets completamente establecidos que esperan ser aceptados, en lugar de la cantidad de solicitudes de conexión incompletas. La longitud máxima de la cola para sockets incompletos se puede configurar usando / proc / sys / net / ipv4 / tcp_max_syn_backlog. Cuando syncookies están habilitados no hay una longitud máxima lógica y esta configuración se ignora. Ver tcp (7) para más información.

, pero incluso con sysctl -w sys.net.ipv4.tcp_max_syn_backlog=2 y sysctl -w net.ipv4.tcp_syncookies=0 , ¡sigo obteniendo los mismos resultados! Debo extrañar algo o no entender por completo el propósito de backlog de listen() .


El argumento de retraso para listen() es solo de asesoramiento.

POSIX dice :

El argumento de retraso proporciona una pista sobre la implementación que la implementación debe usar para limitar el número de conexiones pendientes en la cola de escucha del socket.

Las versiones actuales del kernel de Linux lo redondean a la siguiente potencia máxima de dos, con un mínimo de 16. El código reqsk_queue_alloc() está en reqsk_queue_alloc() .