2011-11-16 19 views
6

Uno de los gen_servers en mi aplicación llame al gen_tcp:listen(Port, [{active, true}]). La primera vez que corro prueba de unidad, devuelve {OK, Socket}, pero la segunda vez que ejecute la misma prueba de la unidad, se devuelve un error {,} EADDRINUSE, peroque usa un puerto TCP?

lsof -i TCP 

vuelve nada. Además, cuando el mismo unit_test se ejecuta dos veces en otra máquina (WinXP), funciona según lo esperado (es decir, devuelve {ok, Socket} las dos veces). Por lo tanto, mi gen_server obviamente libera el puerto, pero Erlang de alguna manera no lo sabe.

Entonces, ¿cómo puedo saber quién cree que Erlang usa esta dirección?

+2

Usted puede utilizar el indicador REUSEADDR a gen_tcp: escuchar para que este comportamiento en Linux desaparezca. – Lukas

Respuesta

9

Esto se debe a los detalles de la implementación de TCP en sistemas Unix: cuando se abre un socket para escuchar, no estará disponible durante unos minutos en el estado CLOSE_WAIT después de que el proceso de escucha se apaga.

Desde comentario Lukas' arriba: se puede utilizar el indicador de REUSEADDR a gen_tcp: escuchar para evitar este

+2

Oh, cómo me encanta el desbordamiento de pila :-D – dijxtra

0

si está en Windows puede utilizar la utilidad netstat para averiguar qué proceso tiene qué puerto se abrió:

http://commandwindows.com/netstat.htm

netstat -a -b -v debe hacer el truco

Linux netstat también soporta mostrando al usuario , pero necesitas una raíz adecuada para eso.

Cuestiones relacionadas