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

时间:2013-03-04 09:59:49

标签: c linux sockets

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

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

为什么会出现此错误?

8 个答案:

答案 0 :(得分:48)

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

  

SO_REUSEADDR究竟做了什么?

     

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

     

有人指出“套接字是一个5元组(proto,local     addr,本地端口,远程地址,远程端口)。 SO_REUSEADDR就是这样说的     您可以重用本地地址。 5元组仍然是必须的     独特!“Michael Hunter(mphunter@qnx.com)。这是真的,而且这个     这就是为什么不太可能看到意外数据的原因     你的服务器。危险在于这样的5元组仍在浮动     在网络上,当它在弹跳时,一个新的连接     来自同一客户端,在同一系统上,碰巧得到相同的     远程端口。理查德史蒂文斯在“2.7请”中解释了这一点     解释TIME_WAIT状态。''。

答案 1 :(得分:26)

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

答案 2 :(得分:26)

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

还要检查你是否绑定了正确的ip地址(我假设它是localhost)

答案 3 :(得分:8)

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

  

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

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

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

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

无论如何,您可以停止使用您的端口的过程,让您的应用程序接受它。

如果您在linux环境中试试,

  • 使用netstat -tulpn显示流程
  • kill <pid>这将终止流程

如果您使用的是Windows,

  • 使用netstat -a -o -n检查端口使用情况
  • 使用taskkill /F /PID <pid>来终止该过程

答案 4 :(得分:5)

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

  1. 其他一些应用程序已经在使用它。
  2. 当您的程序正在等待另一端关闭program.refer(https://unix.stackexchange.com/questions/10106/orphaned-connections-in-close-wait-state)时,端口处于close_wait状态。
  3. 该程序可能处于time_wait状态。您可以等待或使用另一篇文章中提到的套接字选项SO_REUSEADDR
  4. 执行netstat -a | grep <portno>检查端口状态。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

当您没有给袜子文件足够的权限(读写)时,也会发生这种情况!

只需将预期的权限添加到您的袜子包含的文件夹和袜子文件中即可:

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

那就玩得开心!

答案 7 :(得分:0)

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

<块引用>

lsof -ti:PortNumberGoesHere | xargs kill -9

来源和灵感this

PS:无法使用 netstat,因为它还没有安装。