2010-05-18 22 views
7

Estoy usando socket de dominio para obtener valores de otro proceso, como A para obtener un valor de B, funciona bien durante meses. Pero recientemente, A falló durante el mensaje "sendto" a B con "errno 111, connection refused" ocasionalmente.socket de dominio "sendto" encuentro "errno 111, conexión rechazada"

Comprobé el archivo de enlace de socket de dominio B, existe. También hago algunas pruebas en otra máquina, también funciona bien. Entonces, ¿alguien se encuentra con este problema antes? ¿Alguien puede tener algunas pistas de lo que probablemente sea incorrecto en este escenario? Muchas gracias.

Respuesta

3

Cuando he visto este error con los sockets de dominio de Unix, generalmente se debe a que el proceso B no se está ejecutando, o hay una falta de coincidencia en las rutas de conexión. (Si B muere, ¿se reinicia automáticamente? ¿Es posible que las fallas ocurran mientras B ha muerto pero aún no se ha reiniciado?). Otra posibilidad: ¿es posible que se ejecuten varias copias de A al mismo tiempo? Puede obtener el error ECONNREFUSED si la cola de B de conexiones no aceptadas está llena.

que sugeriría que ejecuta los procesos A y B bajo strace, ya sea:

strace -o A.log A 

o, si el proceso ya se está ejecutando,

strace -o B.log -p <process-id-of-B> 

También,

netstat -na 

le dará el estado de todos los sockets de dominio de Unix presentes en el sistema.

+0

'netstat -nap' (cuando se ejecuta como root) también mostrará los procesos conectados a esos sockets. – bstpierre

1

Tenga en cuenta que los sockets en el sistema de archivos no se eliminan automáticamente cuando se cierra el último descriptor de ellos. Intentar conectar o enviar en ese momento causará errores. El servidor deberá quitar el socket en el sistema de archivos antes de que pueda vincularse nuevamente.

2

Considere mirar debajo de y vea si B se está quedando sin descriptores de archivo. Si es así, tiene una fuga de recursos y necesita limpiarla. No debería ser un problema con los programas UDP, pero se han sabido cosas más divertidas. lsof podría ser otra herramienta para usar.

De lo contrario, tiene sugerencias razonables de otras personas - netstat en particular debería ayudar.

0

Proceso B ya no está en el otro lado de su (presumiblemente DGRAM) Zócalo - tal vez murió, o se cierra el gestor de archivo, etc.

sendto(2) en Linux ECONNREFUSED volverá para una SOCK_DGRAM o dominio Unix SOCK_SEQPACKET toma si el extremo receptor está muerto. (Los sockets SOCK_STREAM de unix no harán esto, sino que devolverán ENOTCONN.)

Cuestiones relacionadas