GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo destruir completamente una conexión de socket en C

El close call solo marca el socket TCP cerrado. Ya no se puede utilizar por proceso. Pero el núcleo aún puede contener algunos recursos durante un período (TIME_WAIT, 2MLS, etc.).

La configuración de SO_REUSEADDR debería eliminar los problemas de vinculación.

Así que asegúrese de que el valor de true es realmente distinto de cero cuando se llama a setsockopt (el error de desbordamiento puede sobrescribirlo):

true = 1;
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int))

Hay pid variable es su código. Si usa fork (para iniciar los procesos de manejo de conexiones), entonces debe cerrar sock también en el proceso que no lo necesita.


Primero por el nombre, para que todos nombremos las mismas cosas de la misma manera:

Lado del servidor:

El socket pasó a listen() y luego a accept() llamemos a la escucha socket. El socket devuelto por accept() llamemos al aceptado enchufe.

Lado del cliente:

El socket pasó a connect() llamemos a conectando/conectado enchufe.

Con respecto a su problema:

Para terminar el accept() ed conexión cerrar el aceptado enchufe (lo que llamas conectado) opcionalmente usando primero shutdown() seguido de close () .

Para luego aceptar un nuevo bucle de conexión justo antes de la llamada a accept() , no ir a través de bind() y listen() de nuevo.

Solo apagar y cierra la escucha socket si desea deshacerse de pendiente connect() s emitido después de accept() devuelto.


La conexión aún está activa porque olvidó cerrar el enchufe conectado. Cerrar la toma de escucha no cierra automáticamente la toma conectada.

//necessary code
close(connected);  // <---- add this line
close(sock);
goto label;

Sin embargo, no estoy seguro de por qué está tomando EADDRINUSE. El código funcionó bien tanto en Linux como en Mac OS.


Linux
  1. ¿Cómo cerrar puertos en Linux?

  2. Linux:¿cómo crear una conexión ad-hoc?

  3. ¿Cómo monitorear una conexión serial a 250000 baudios?

  4. Cómo:Programación de sockets en Python

  5. ¿Cómo cerrar rmiregistry ejecutándose en un puerto en particular?

Cómo forzar a Wget a usar una conexión IPv4 o IPv6

cómo vincular un socket sin procesar a una interfaz específica

El socket de Python no cierra la conexión correctamente

¿Cómo elimino una conexión de enchufe CLOSE_WAIT?

Cómo saber si una conexión ssh ControlMaster está en uso

¿Cómo compartir la conexión a Internet?