谁使用TCP端口?

时间:2011-11-16 15:38:42

标签: tcp erlang

我的应用程序中的一个gen_servers调用gen_tcp:listen(Port, [{active, true}])。我第一次运行单元测试,它返回{ok,Socket},但第二次运行相同的单元测试时,它返回{error,eaddrinuse},但是

lsof -i TCP

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

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

2 个答案:

答案 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权限。