gpt4 book ai didi

c++ - 为什么 bind() 有时会在另一端连接时给出 EADDRINUSE?

转载 作者:太空狗 更新时间:2023-10-29 20:29:18 26 4
gpt4 key购买 nike

在我的 C++ 应用程序中,我将::bind() 用于 UDP 套接字,但在极少数情况下,由于连接丢失而重新连接后,即使重试多次,我也会收到错误号 EADDRINUSE。将接收数据的 UDP 连接的另一端重新连接正常,正在等待 select() 指示有内容要读取。

我认为这意味着本地端口正在使用中。如果为真,我怎么会泄露本地端口,以便另一端连接到它?这里真正的问题是另一端连接正常并且正在等待,但这一端卡在 EADDRINUSE 上。

--编辑--

这是一个代码片段,显示我已经在我的 TCP 套接字上执行 SO_REUSEADDR,而不是在我遇到问题的这个 UDP 套接字上:

// According to "Linux Socket Programming by Example" p. 319, we must call
// setsockopt w/ SO_REUSEADDR option BEFORE calling bind.
// Make the address is reuseable so we don't get the nasty message.
int so_reuseaddr = 1; // Enabled.
int reuseAddrResult
= ::setsockopt(getTCPSocket(), SOL_SOCKET, SO_REUSEADDR, &so_reuseaddr,
sizeof(so_reuseaddr));

这是我完成后关闭 UDP 套接字的代码:

void
disconnectUDP()
{
if (::shutdown(getUDPSocket(), 2) < 0) {
clog << "Warning: error during shutdown of data socket("
<< getUDPSocket() << "): " << strerror(errno) << '\n';
}
if (::close(getUDPSocket()) < 0 && !seenWarn) {
clog << "Warning: error while closing data socket("
<< getUDPSocket() << "): " << strerror(errno) << '\n';

}
}

最佳答案

是的,这很正常。您需要在绑定(bind)之前设置套接字 SO_REUSEADDR,例如在 *nix 上:

int sock = socket(...);

int yes = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));

如果您有通过创建新套接字重新连接的单独代码,也将其设置在那个套接字上。这只是与操作系统的默认行为有关——损坏的套接字上的端口会保持失效一段时间。

[编辑] 这不应适用于 UDP 连接。也许您应该发布用于设置套接字的代码。

关于c++ - 为什么 bind() 有时会在另一端连接时给出 EADDRINUSE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10384575/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com