79

I am attempting to bind a socket to a port below:

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

But it gives:

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

Why does this error occur?

4

9 回答 9

87

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

SO_REUSEADDR 究竟是做什么的?

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

有人指出“一个socket是一个5元组(proto,local addr,local port,remote addr,remote port)。SO_REUSEADDR只是说你可以重用本地地址。5元组仍然必须是唯一的!” 迈克尔·亨特 (mhunter@qnx.com)。这是真的,这就是为什么您的服务器不太可能看到意外数据的原因。危险是这样一个 5 元组仍然在网络上四处飘荡,当它四处弹跳时,来自同一客户端的新连接,在同一系统上,碰巧获得了相同的远程端口。Richard Stevens 在“2.7 请解释 TIME_WAIT 状态”中对此进行了解释。

于 2013-03-04T10:09:10.130 回答
53

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

于 2013-03-04T10:03:12.007 回答
48

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

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

于 2013-03-04T10:03:12.710 回答
44

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

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

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

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

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

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

如果你在linux环境下试试,

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

如果您使用的是窗户,

  • 用于netstat -a -o -n检查端口使用情况
  • 用于taskkill /F /PID <pid>杀死该进程
于 2018-06-01T05:22:53.533 回答
10

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

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

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

于 2013-03-04T10:15:07.723 回答
5

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

lsof -ti:PortNumberGoesHere | xargs 杀死 -9

来源和灵感

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

于 2021-06-21T09:01:36.920 回答
1

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

于 2018-04-01T08:30:03.960 回答
1

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

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

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

然后玩得开心!

于 2019-10-26T19:56:36.550 回答
1

终止所有节点进程:

killall -9 node
于 2022-01-24T00:45:36.640 回答