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

问题描述 投票:39回答:7

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

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

为什么会出现此错误?

c linux sockets
7个回答
27
投票

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

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


53
投票

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

SO_REUSEADDR到底做什么?

此套接字选项告诉内核,即使此端口忙(在TIME_WAIT状态),请继续使用它。如果忙的话但在另一种状态下,您仍然会获得一个已在使用的地址错误。如果您的服务器已关闭,然后立即重新启动,而其端口上的套接字仍处于活动状态。您请注意,如果有任何意外数据输入,可能会造成混淆您的服务器,但是虽然有可能,但是不太可能。

已指出“套接字是一个5元组(原始,本地地址,本地端口,远程地址,远程端口)。 SO_REUSEADDR只是说您可以重用本地地址。 5元组仍然必须唯一!”作者Michael Hunter([email protected])。这就是为什么极不可能出现意外数据的原因您的服务器。危险是这样的5元组仍在浮动在网上跳来跳去时,一个新的连接来自同一客户端,在同一系统上,恰好获得相同远程端口。理查德·史蒂文斯(Richard Stevens)在``2.7 Please解释TIME_WAIT状态。.


29
投票

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


12
投票

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

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

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

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

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

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

如果您在Linux环境中,请尝试,

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

如果使用的是Windows,则>

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

5
投票

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


0
投票

我也遇到了这个问题,但是我解决了。在我的案例中为NetBeans,请确保[用于客户端和服务器的程序都在IDE中的不同项目


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.