
Si mi programa C usa sockets, se vincula a localhost:9025
, intercambia algunos datos, se cierra y se reinicia manualmente, a veces falla y el error es el siguiente:
Dirección ya en uso.
Todo el software recomendado por SE con el que intenté buscar "pid que usa el puerto" no devolvió ninguna identificación de proceso, por lo que supongo que no hay ningún proceso en ese momento que use el puerto 9025
, lo cual debería ser el caso.
No obstante, por lo que he recopilado de comentarios sobre preguntas de temática similar, me pareció que "Dirección" "ya está en uso" si y sólo si un proceso usa esa dirección en particular. ¿Por qué es esto falso entonces?
Ahora supongo que el sistema operativo realiza un seguimiento de qué direcciones están en uso y cuáles no, pero ¿es ese el caso? Sin embargo, si es así, me encantaría que me dijeras cómo lo corrijo, porque mi mejor solución a este problema es "esperar un tiempo indeterminado".
EDITAR: uso Linux 5.2.2-arch1-1-ARCH x86_64
Respuesta1
Probablemente esté reiniciando su programa demasiado rápido o el programa no cierra el socket.
Incluso después de cerrar el socket, Linux mantiene la conexión en el limbo durante algún tiempo, pero evitará que se acepte cualquier otra conexión para el mismo cuatrillizo de "dirección de origen, puerto de origen, dirección de destino, puerto de destino".
La solución es configurar la opción de socket en el programa con conjuntosopt como esto:
setsockopt(socket,SOL_SOCKET,SO_REUSEADDR ... )