【问题标题】:Bind failed: Address already in use绑定失败:地址已在使用中
【发布时间】:2013-02-18 09:07:41
【问题描述】:

我正在尝试将套接字绑定到以下端口:

if( bind(socket_desc,(struct sockaddr *) &server, sizeof(server)) < 0)
{
    perror("bind failed. Error");
    return 1;
}
puts("bind done");

但它给出了:

$ ./serve   
Socket created    
bind failed. Error: Address already in use

为什么会出现这个错误?

【问题讨论】:

  • 使用不同的端口号?
  • 使用尚未使用的地址。
  • 我明白了..我选择了不同的端口...感谢您的帮助..谢谢大家。
  • 当我关闭服务器程序而客户端程序仍在运行时,我遇到了同样的问题。这使套接字进入TIME_WAIT 状态。这是对该问题的详细讨论:How to forcibly close a socket in TIME_WAIT?
  • 为什么这个问题被关闭了?它涵盖了套接字编程的一个常见问题,并且问题的答案很有用且正确。它确实帮助了我。

标签: c linux sockets


【解决方案1】:

终止所有节点进程:

killall -9 node

【讨论】:

    【解决方案2】:

    如果地址已经在使用中,你是否只想杀死正在使用该端口的进程,你可以使用

    lsof -ti:PortNumberGoesHere | xargs 杀死 -9

    来源和灵感this

    PS:无法使用 netstat,因为它尚未安装。

    【讨论】:

      【解决方案3】:

      当您没有为您的 sock 文件提供足够的权限(读取和写入)时,也会发生这种情况!

      只需将预期的权限添加到您的 sock 包含的文件夹和您的 sock 文件:

       chmod ug+rw /path/to/your/
       chmod ug+rw /path/to/your/file.sock
      

      那就玩得开心吧!

      【讨论】:

        【解决方案4】:

        该错误通常意味着您尝试打开的端口已被另一个应用程序使用。尝试使用 netstat 查看打开的端口,然后使用可用端口。

        还要检查您是否绑定到正确的 IP 地址(我假设它是 localhost)

        【讨论】:

        • 也可能是您正在运行像 fiddler (telerik.com/fiddler) 这样的 Web 调试代理。我在我的机器上遇到了同样的错误,我关闭了提琴手,并且能够正常进行。
        • 也可能是TIME-WAIT状态有剩余端口。如果 IP 地址错误,错误将是“无法分配请求的地址”,并且应该假定的默认值不是 localhost,而是 INADDR_ANY。
        • 对于基于pythonpython3 的应用程序,只需关闭所有此类应用程序,然后继续。使用pkill -9 python & pkill -9 python3
        【解决方案5】:

        我也遇到过这个问题,但我解决了。 确保客户端和服务器端的程序都在您的 IDE 中的不同项目上,在我的例子中是 NetBeans。然后假设您使用 localhost,我建议您将这两个程序实现为 两个不同的项目

        【讨论】:

          【解决方案6】:

          Address already in use 表示您尝试为当前执行分配的port 已被其他进程占用/分配。

          如果您是开发人员并且正在开发需要大量测试的应用程序,您可能会在后台运行同一应用程序的一个实例(可能是您忘记正确停止它)

          因此,如果您遇到此错误,只需查看哪个应用程序/进程正在使用该端口。

          在 linux 中尝试使用netstat -tulpn。此命令将列出所有正在运行的进程的进程列表。

          检查应用程序是否正在使用您的端口。 如果该应用程序或进程是另一个重要的应用程序或进程,那么您可能希望使用另一个未被任何进程使用的端口/应用程序。

          无论如何,您都可以停止使用您的端口的进程并让您的应用程序使用它。

          如果你是linux环境试试,

          • 使用netstat -tulpn 显示进程
          • kill &lt;pid&gt;这将终止进程

          如果你使用的是windows,

          • 使用netstat -a -o -n 检查端口使用情况
          • 使用taskkill /F /PID &lt;pid&gt; 杀死该进程

          【讨论】:

          • kill -9 用于 Ubuntu?
          【解决方案7】:

          每个人都是正确的。但是,如果您还忙于测试您的代码,那么您的 自己的 应用程序可能仍然“拥有”套接字,如果它启动和停止相对较快的话。尝试SO_REUSEADDR 作为套接字选项:

          SO_REUSEADDR 究竟是做什么的?

          这个套接字选项告诉内核即使这个端口很忙(在 TIME_WAIT 状态),继续并重用它。如果很忙, 但是在另一个州,你仍然会得到一个已经在使用的地址 错误。如果您的服务器已关闭,这很有用,然后 在其端口上的套接字仍处于活动状态时立即重新启动。你 应该知道,如果有任何意外的数据进来,它可能会混淆 您的服务器,但虽然这是可能的,但不太可能。

          已经指出“一个套接字是一个 5 元组 (proto, local 地址,本地端口,远程地址,远程端口)。 SO_REUSEADDR 只是说 您可以重复使用本地地址。 5 元组仍然必须是 独一无二!”由 Michael Hunter (mphunter@qnx.com) 撰写。这是真的,而且这个 这就是为什么人们不太可能看到意外数据的原因 你的服务器。危险是这样一个 5 元组还在浮动 在网上四处走动,当它四处弹跳时,一个新的连接 来自同一个客户端,在同一个系统上,恰好得到相同的结果 远程端口。 Richard Stevens 在 ``2.7 Please 解释 TIME_WAIT 状态。''。

          【讨论】:

          • easyengine.io/tutorials/nginx/troubleshooting/… 上面的链接只解决了我的问题...虽然我使用了 (SO_REUSEADDR | SO_REUSEPORT) 这两个问题都发生了。
          • @iDebD_gh SO_REUSEPORT 仅适用于 UDP。
          • 请注意,如果有问题的端口位于负载均衡器后面,SO_REUSEADDR 可能会产生负面影响。
          【解决方案8】:

          如上所述,该端口已在使用中。 这可能是由于几个原因

          1. 其他一些应用程序已经在使用它。
          2. 当您的程序正在等待另一端关闭程序时,端口处于close_wait 状态。请参阅(https://unix.stackexchange.com/questions/10106/orphaned-connections-in-close-wait-state)。
          3. 程序可能处于time_wait 状态。您可以等待或使用另一篇文章中提到的套接字选项SO_REUSEADDR

          netstat -a | grep &lt;portno&gt;检查端口状态。

          【讨论】:

          • 我们如何在这个端口号手动停止这个应用程序?
          • CLOSE-WAIT 表示端口正在等待此端关闭它,而不是远程端。你的链接也是这么说的。
          • CLOSE_WAIT 表示您的程序仍在运行,并且尚未关闭套接字(内核正在等待它这样做)。 SO_REUSEADDR 用于服务器和TIME_WAIT 套接字,因此不适用于此处
          • Windows:netstat -ano | findstr ":8080"(查找 pid - 最后一列 - 用于端口)然后 taskkill /F /PID &lt;pid&gt; 使用 pid 终止进程。
          【解决方案9】:

          您有一个进程已经在使用该端口。 netstat -tulpn 将使人们能够找到正在使用特定端口的进程 ID。

          【讨论】:

            猜你喜欢
            • 2018-04-01
            • 1970-01-01
            • 1970-01-01
            • 2019-07-29
            • 2013-12-02
            • 2021-10-02
            • 1970-01-01
            相关资源
            最近更新 更多