2011-11-16 57 views
6

我的应用程序中的gen_servers之一调用gen_tcp:listen(Port, [{active, true}])。我第一次运行单元测试,它返回{OK,插座},但我跑得同样的单元测试第二次,它返回一个错误{,EADDRINUSE},但谁使用TCP端口?

lsof -i TCP 

回报什么。另外,当相同的unit_test在另一台机器(WinXP)上运行两次时,它按预期工作(即返回{ok,Socket}两次)。因此,我的gen_server显然释放了这个端口,但是Erlang不知道那个。

那么,我怎样才能弄清Erlang认为谁使用这个地址?

+2

可以使用reuseaddr标志来调用gen_tcp:听就Linux的这种行为消失。 – Lukas

回答

9

这是因为在Unix系统上TCP的实现细节 - 当一个套接字打开进行监听时,它会在监听过程关闭后的CLOSE_WAIT状态中停留几分钟。

从上面卢卡斯注释:您可以使用reuseaddr标志来调用gen_tcp:听避免这种

+2

哦,我爱堆栈溢出:-D – dijxtra

0

,如果你在Windows下你可以使用netstat工具来找出哪个进程具有哪些端口打开:

http://commandwindows.com/netstat.htm

netstat -a -b -v应该做的伎俩

的Linux的netstat还支持显示用户,但你需要root权利。