gpt4 book ai didi

c++ - 使用 setsockopt() 指定超时选项会导致随后的监听错误

转载 作者:太空宇宙 更新时间:2023-11-04 09:28:27 26 4
gpt4 key购买 nike

现在,我正在尝试使用以下代码通过 setsockopt() 指定选项:

// bind socket
// Use setsockopt() function to make sure the port is not in use
int yes = 1;
setsockopt(TCPSocket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));
setsockopt(TCPSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv,sizeof(struct timeval));
status = bind(TCPSocket, host_info_list->ai_addr, host_info_list->ai_addrlen);
if (status == -1) std::cout << "bind error" << std::endl ;

// listen for connections
status = listen(TCPSocket, 5);
if (status == -1) std::cout << "listen error" << std::endl ;

int new_sd;
struct sockaddr_storage their_addr;
socklen_t addr_size = sizeof(their_addr);
new_sd = accept(TCPSocket, (struct sockaddr *)&their_addr, &addr_size);
if (new_sd == -1) std::cout << "listen error" << std::endl ;

注意 tv 是一个已经指定的时间间隔。

当我只进行第一个 setsockopt() 调用时,一切正常。但是,随着第二个(不返回任何错误)的添加,我遇到了代码中指定的第二个“监听错误”。我不确定为什么设置超时值会影响这一点,有人可以解释一下吗?

我不把指定的代码据为己有;它是根据此处教程中提供的代码修改的:http://codebase.eu/tutorial/linux-socket-programming-c/

最佳答案

如果您看到 TCP 状态图 like this one当主动关闭套接字时,您会看到一个名为 TIME_WAIT 的状态。根据RFC793,这种状态可能需要一些时间才能结束,最多四分钟。 .

当套接字处于TIME_WAIT 时,您不能使用与处于等待状态的套接字相同的地址-端口对绑定(bind)到接口(interface)。在套接字上设置 SO_REUSEADDR 标志可以让其他套接字在当前套接字(设置了标志)处于 TIME_WAIT 状态时绑定(bind)到该地址。

SO_REUSEADDR 选项对服务器(被动、监听)套接字最有用。


至于您的问题,在每次调用 setsockopt 后检查它返回的内容,如果它是 -1 那么你检查 errno看看出了什么问题。您可以使用 perrorstrerror打印或获取错误的可打印字符串,例如

if (setsockopt(TCPSocket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) < 0)
{
std::cerr << "Error setting the SO_REUSEADDR: " << strerror(errno) << '\n';
// Do something appropriate
}

关于c++ - 使用 setsockopt() 指定超时选项会导致随后的监听错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33865159/

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