绑定失败:地址已被使用

我试图将一个套接字绑定到下面的端口:

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 

为什么会发生这种错误?

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

另外检查你是否绑定到正确的IP地址(我假设它将是本地主机)

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

SO_REUSEADDR究竟做了什么?

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

有人指出:“一个套接字是一个5元组(原型,本地地址,本地端口,远程地址,远程端口),SO_REUSEADDR只是说你可以重用本地地址,5元组仍然必须是唯一的! Michael Hunter(mphunter@qnx.com)。 这是真的,这就是为什么你的服务器不可能看到意外的数据。 危险之处在于,这样一个5元组仍然在网络上浮动,并且在同一个系统上来自同一个客户端的新连接正在反弹的时候恰好得到相同的远程端口。 理查德·史蒂文斯在“2.7请解释TIME_WAIT状态”中解释了这一点。

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

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

  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> netstat -a | grep <portno>检查端口状态。