2013-03-04 102 views
22

我试图将套接字绑定到以下端口:绑定失败:地址已在使用

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 

为什么会出现这种错误发生的呢?

+1

使用不同的端口号? – Nick 2013-03-04 10:01:10

+2

使用尚未使用的地址。 – 2013-03-04 10:02:02

+0

我明白了..我选择不同的端口...感谢您的帮助.. 谢谢大家。 – TamiL 2013-03-04 10:18:56

回答

18

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

另外,请检查您是否绑定到正确的IP地址(我假定这将是localhost)

+1

也可能是您正在运行网络调试代理,如fiddler(http://www.telerik.com/fiddler)。我在我的机器上发现了同样的错误,我关闭了提琴手,并且能够继续正常工作。 – farskeptic 2014-04-05 13:21:17

+1

也可以在TIME-WAIT状态下有剩余的端口。如果IP地址错误,则错误将是“无法分配请求的地址”,并且应假定的默认值不是“localhost”,而是INADDR_ANY。 – EJP 2017-04-23 10:44:02

15

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

36

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

SO_REUSEADDR究竟做什么?

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

有人指出,“套接字是一个5元组(原,当地 地址,本地端口,远程地址,远程端口)。SO_REUSEADDR只是说 可以重用本地地址。该5元组仍然必须是独一无二的 !“作者Michael Hunter([email protected])。这是真的,而这个 就是为什么你的服务器不可能看到意外的数据。危险的是,这样一个5元组仍然在网络上漂浮着,并且当它弹跳时,来自同一客户端的新连接 在同一个系统上恰好得到相同的 远程端口。这由理查德史蒂文斯在``2.7请解释TIME_WAIT状态'请求 '解释。''。

+1

https://easyengine.io/tutorials/nginx/troubleshooting/emerg-bind-failed-98-address-already-in-use/ 上面的链接只解决了我的问题...虽然我用(SO_REUSEADDR | SO_REUSEPORT)这个问题都发生了。 – 2016-03-04 09:47:04

+1

@iDebD_gh SO_REUSEPORT仅适用于UDP。 – EJP 2017-04-23 10:44:51

+0

请注意,如果有问题的端口位于Load Balancer后面,则SO_REUSEADDR可能会产生负面影响。 – kmarsh 2017-05-24 18:40:22

4

如上所述,端口已被使用。 这可能是由于几个原因造成的

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

执行netstat -a | grep <portno>来检查端口状态。

+6

我们如何在此端口号手动停止此应用程序? – user2925949 2016-04-20 06:07:39

+0

CLOSE-WAIT表示端口正在等待此端关闭它,而不是远端。这就是你的链接所说的。 – EJP 2017-04-23 09:30:37

相关问题