谁使用TCP端口?

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

该函数不返回任何内容。此外,在另一台机器(WinXP)上运行相同的unit_test两次时,它按预期工作(即两次都返回{ok,Socket})。因此,我的gen_server显然释放了端口,但Erlang不知道这一点。

那么,我该如何找出Erlang认为是谁在使用这个地址?


2
你可以使用reuseaddr标志来调用gen_tcp:listen函数,以消除Linux上的这种行为。 - Lukas
2个回答

9
这是因为Unix系统上TCP的实现细节--当一个套接字被打开作为监听时,在监听进程关闭后它会在CLOSE_WAIT状态下不可用几分钟。
根据Lukas的评论,你可以使用reuseaddr标志来避免这种情况。

2
哦,我是多么喜欢 Stack Overflow 呀 :-D - dijxtra

0
如果你使用的是Windows系统,你可以使用netstat工具来查找哪个进程打开了哪个端口:

http://commandwindows.com/netstat.htm

netstat -a -b -v 应该可以解决问题。

Linux 的 netstat 也支持显示用户,但需要 root 权限。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接