Pregunta

Tomé Computer Networking el semestre pasado e hice algo de programación en C en Linux (usando gcc) para mis proyectos. Una cosa extremadamente tediosa con la que me encontraba constantemente era que si mi programa se bloqueaba o se detenía (que luego tendría que presionar Ctrl + C para matarlo), el puerto de red aún se dejaría abierto durante un minuto más o menos. Entonces, si quisiera volver a ejecutar el programa inmediatamente, primero tendría que ir al archivo de encabezado, cambiar el puerto, rehacer el programa y finalmente ejecutarlo. Obviamente, esto se vuelve muy tedioso muy rápido.

¿Hay alguna forma de configurarlo donde el puerto se libera de inmediato tan pronto como finaliza el proceso? ¿A través de alguna configuración en Linux, o en el archivo MAKE para mi programa, o incluso programáticamente en C?

Editar: me refiero al escribir un servidor y elegir un puerto específico para alojar el programa.

¿Fue útil?

Solución

Establezca la opción SO_REUSEADDR en el zócalo.

int yes = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));

De Guía de Beej para la programación de redes .

Otros consejos

Apuesto a que son unos dos minutos :) Como señaló @Cogsy, la opción de socket SO_REUSEADDR es tu amigo. Familiarícese con los estados TCP, es el estado TIME_WAIT que le causa problemas:

 

Supongo que el programa que está escribiendo es un servidor, por lo que debe usar un puerto conocido. Si ese es el caso, debe usar la opción SO_REUSE_ADDR en el zócalo como señala Cogsy.

Si, por otro lado, está escribiendo un sw de cliente, entonces debe evitar elegir un puerto en particular, permitiendo que el sistema le entregue uno aleatorio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top