我的应用程序中的一个gen_servers调用gen_tcp:listen(Port, [{active, true}])。我第一次运行单元测试,它返回{ok,Socket},但第二次运行相同的单元测试时,它返回{error,eaddrinuse},但是
lsof -i TCP
什么都不返回。此外,当相同的unit_test在另一台机器(WinXP)上运行两次时,它按预期工作(即,两次都返回{ok,Socket})。因此,我的gen_server显然会释放端口,但Erlang不知何故不知道。
那么,我怎么能弄清楚Erlang认为谁使用这个地址?
答案 0 :(得分:9)
这是因为在Unix系统上实现TCP的细节 - 当打开一个套接字进行监听时,在侦听进程关闭后它将在CLOSE_WAIT状态下保持几分钟不可用。
从Lukas上面的评论:你可以使用reuseaddr标志来gen_tcp:听听避免这个
答案 1 :(得分:0)
如果你在Windows上,你可以使用netstat实用程序找出哪个进程有哪个端口打开:
http://commandwindows.com/netstat.htm
netstat -a -b -v
应该做的伎俩
Linux netstat还支持向用户显示,但你需要root权限。