绑定失败:地址已在使用中
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。
对于基于python
或python3
的应用程序,只需关闭所有此类应用程序,然后继续。使用pkill -9 python
& pkill -9 python3
【参考方案5】:
我也遇到过这个问题,但我解决了。 确保客户端和服务器端的程序都在您的 IDE 中的不同项目上,在我的例子中是 NetBeans。然后假设您使用 localhost,我建议您将这两个程序实现为 两个不同的项目。
【讨论】:
【参考方案6】:Address already in use
表示您尝试为当前执行分配的port
已被其他进程占用/分配。
如果您是开发人员并且正在开发需要大量测试的应用程序,您可能会在后台运行同一应用程序的一个实例(可能是您忘记正确停止它)
因此,如果您遇到此错误,只需查看哪个应用程序/进程正在使用该端口。
在 linux 中尝试使用netstat -tulpn
。此命令将列出所有正在运行的进程的进程列表。
检查应用程序是否正在使用您的端口。 如果该应用程序或进程是另一个重要的应用程序或进程,那么您可能希望使用另一个未被任何进程使用的端口/应用程序。
无论如何,您都可以停止使用您的端口的进程并让您的应用程序使用它。
如果你是linux环境试试,
使用netstat -tulpn
显示进程
kill <pid>
这将终止进程
如果你使用的是windows,
使用netstat -a -o -n
检查端口使用情况
使用taskkill /F /PID <pid>
杀死该进程
【讨论】:
kill -9每个人都是正确的。但是,如果您还忙于测试您的代码,那么您的 自己的 应用程序可能仍然“拥有”套接字,如果它启动和停止相对较快的话。尝试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 <portno>
检查端口状态。
【讨论】:
我们如何在这个端口号手动停止这个应用程序? CLOSE-WAIT 表示端口正在等待此端关闭它,而不是远程端。你的链接也是这么说的。CLOSE_WAIT
表示您的程序仍在运行,并且尚未关闭套接字(内核正在等待它这样做)。 SO_REUSEADDR
用于服务器和TIME_WAIT
套接字,因此不适用于此处
Windows:netstat -ano | findstr ":8080"
(查找 pid - 最后一列 - 用于端口)然后 taskkill /F /PID <pid>
使用 pid 终止进程。【参考方案9】:
您有一个进程已经在使用该端口。 netstat -tulpn
将使人们能够找到正在使用特定端口的进程 ID。
【讨论】:
以上是关于绑定失败:地址已在使用中的主要内容,如果未能解决你的问题,请参考以下文章
WSO2 Identity Server 和 WSO2 API Manager 集成 - 错误:传输错误 202:绑定失败:地址已在使用中
通过 SSH 隧道的 Java Swing 应用程序 MySQL 连接失败,并显示“本地端口 127.0.0.1:...无法绑定...地址已在使用中:JVM_Bind”