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

新手上路,请多包涵

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

 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

为什么会出现这个错误?

原文由 TamiL 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

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

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

原文由 Techmonk 发布,翻译遵循 CC BY-SA 4.0 许可协议

每个人都是正确的。但是,如果您还忙于测试您的代码,您 自己的 应用程序可能仍然“拥有”套接字,如果它启动和停止相对较快。尝试 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 状态”中对此进行了解释。

原文由 Joe 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题