【问题标题】:who uses a TCP port?谁使用 TCP 端口?
【发布时间】:2011-12-30 13:23:34
【问题描述】:

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

lsof -i TCP

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

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

【问题讨论】:

  • 您可以对 gen_tcp:listen 使用 reuseaddr 标志来消除 Linux 上的这种行为。

标签: tcp erlang


【解决方案1】:

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

http://commandwindows.com/netstat.htm

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

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

【讨论】:

    【解决方案2】:

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

    来自 Lukas 上面的评论:您可以使用 reuseaddr 标志 gen_tcp:listen 来避免这种情况

    【讨论】:

    • 哦,我多么喜欢堆栈溢出:-D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    相关资源
    最近更新 更多