绑定失败:地址已在使用中

Posted

技术标签:

【中文标题】绑定失败:地址已在使用中【英文标题】: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? 为什么这个问题被关闭了?它涵盖了套接字编程的一个常见问题,并且问题的答案很有用且正确。它确实帮助了我。 【参考方案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】:

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

    其他一些应用程序已经在使用它。 当您的程序正在等待另一端关闭程序时,端口处于close_wait 状态。请参阅(https://unix.stackexchange.com/questions/10106/orphaned-connections-in-close-wait-state)。 程序可能处于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。

【讨论】:

以上是关于绑定失败:地址已在使用中的主要内容,如果未能解决你的问题,请参考以下文章

为啥我收到“地址已在使用(绑定失败)”? [复制]

Docker 错误绑定:地址已在使用中

WSO2 Identity Server 和 WSO2 API Manager 集成 - 错误:传输错误 202:绑定失败:地址已在使用中

通过 SSH 隧道的 Java Swing 应用程序 MySQL 连接失败,并显示“本地端口 127.0.0.1:...无法绑定...地址已在使用中:JVM_Bind”

无法绑定到“127.0.0.1:6600”:地址已在使用中

BOOST ASIO:为啥我在 Windows 中没有得到“绑定:地址已在使用”(但在 Linux 中得到它)?