谁使用 TCP 端口?

发布于 2024-12-16 11:09:50 字数 473 浏览 1 评论 0原文

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

lsof -i TCP

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

那么,我怎样才能知道Erlang认为谁使用了这个地址呢?

One of gen_servers in my app call gen_tcp:listen(Port, [{active, true}]). First time I run unit test, it returns {ok, Socket}, but second time I run the same unit test, it returns an {error, eaddrinuse}, but

lsof -i TCP

returns nothing. Also, when the same unit_test is run twice on another machine (WinXP), it works as expected (that is, returns {ok, Socket} both times). Therefore, my gen_server obviously releases the port, but Erlang somehow doesn't know that.

So, how can I figure out who does Erlang think uses this address?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

野稚 2024-12-23 11:09:50

这是因为 TCP 在 Unix 系统上的实现细节——当打开套接字进行监听时,在监听进程关闭后,它将在 CLOSE_WAIT 状态下保持几分钟不可用状态。

从上面卢卡斯的评论:您可以使用reuseaddr标志到gen_tcp:listen来避免这种情况

This is because of details of the implementation of TCP on Unix systems-- when a socket is opened for listening, it will stay unavailable for a few minutes in the CLOSE_WAIT state after the listening process shuts down.

From Lukas' comment above: you can use reuseaddr flag to gen_tcp:listen to avoid this

℡Ms空城旧梦 2024-12-23 11:09:50

如果您使用的是 Windows,则可以使用 netstat 实用程序找出哪个进程打开了哪个端口:

http://commandwindows。 com/netstat.htm

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

Linux netstat 也支持显示用户,但你需要 root 权限才能做到这一点。

if you are on windows you can use the netstat utility to find out which process has which port opened:

http://commandwindows.com/netstat.htm

netstat -a -b -v should do the trick

Linux netstat also supports showing the user, but you need root right for that.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文