programming - ¿No se puede asignar la dirección solicitada-causas posibles?
socket tcp in c (4)
Resulta que el problema realmente era que la dirección estaba ocupada; la actividad estaba causada por algunos otros problemas en la forma en que manejamos las comunicaciones de la red. Sus aportaciones me han ayudado a resolver esto. Gracias.
EDITAR: para ser específicos, los problemas en el manejo de nuestras comunicaciones de red fueron que estas actualizaciones de estado se reenviarían constantemente si fallaba la primera. Era solo una cuestión de tiempo hasta que todos los esclavos distribuidos intentaran enviar su actualización de estado al mismo tiempo, lo que estaba saturando nuestra red.
Tengo un programa que consiste en un servidor maestro y servidores esclavos distribuidos. Los servidores esclavos envían actualizaciones de estado al servidor, y si el servidor no ha recibido noticias de un esclavo específico en un período fijo, marca al esclavo como inactivo. Esto está sucediendo constantemente.
Tras inspeccionar los registros, he encontrado que el esclavo solo puede enviar una actualización de estado al servidor y, luego, nunca puede enviar otra actualización, siempre fallando en la llamada a connect () "No se puede asignar la dirección solicitada (99).
Por extraño que parezca, el esclavo puede enviar otras actualizaciones al servidor y todas las conexiones se realizan en el mismo puerto. Parece que la causa más común de este error es que las conexiones se dejan abiertas, pero tengo problemas para encontrar algo que quede abierto. ¿Hay otras explicaciones posibles?
Para aclarar, así es como me estoy conectando:
struct sockaddr *sa; // parameter
size_t sa_size; //parameter
int i = 1;
int stream;
stream = socket(AF_INET,SOCK_STREAM,0);
setsockopt(stream,SOL_SOCKET,SO_REUSEADDR,&i,sizeof(i));
bindresvport(stream,NULL);
connect(stream,sa,sa_size);
Este código está en una función para obtener una conexión a otro servidor, y una falla en cualquiera de esas 4 llamadas hace que la función falle.
Tal vez SO_REUSEADDR ayuda aquí? http://www.unixguide.net/network/socketfaq/4.5.shtml
esto es solo un disparo en la oscuridad: cuando llama a conectar sin un enlace primero, el sistema asigna su puerto local, y si tiene múltiples hilos de conexión y desconexión, posiblemente intente asignar un puerto que ya esté en uso. El archivo fuente del kernel inet_connection_sock.c sugiere esta condición. al igual que un experimento, intente realizar un enlace a un puerto local primero, asegurándose de que cada enlace / conexión utilice un número de puerto local diferente.
sysctl -w net.ipv4.tcp_timestamps=1
sysctl -w net.ipv4.tcp_tw_recycle=1