使用setsockopt()指定超时选项会导致后续的侦听错误
Specifying timeout option with setsockopt() results in subsequent listen error
现在,我正尝试使用以下代码用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状态图,您会看到在主动关闭套接字时有一个名为TIME_WAIT
的状态。这种状态可能需要一些时间才能结束,根据RFC793,最长需要四分钟。
当套接字处于TIME_WAIT
时,您不能使用与处于等待状态的套接字相同的地址端口对绑定到接口。当当前套接字(已设置标志)处于TIME_WAIT
状态时,从套接字设置SO_REUSEADDR
标志可使其他套接字绑定到该地址。
SO_REUSEADDR
选项对于服务器(被动、侦听)套接字最有用。
至于您的问题,在每次调用setsockopt
之后,请检查它返回的内容,如果是-1
,则检查errno
以查看出了什么问题。您可以使用perror
或strerror
打印或获取错误的可打印字符串,如
if (setsockopt(TCPSocket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) < 0)
{
std::cerr << "Error setting the SO_REUSEADDR: " << strerror(errno) << 'n';
// Do something appropriate
}
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- setsockopt() 在设置大套接字 recv 缓冲区时不返回错误
- 将 &mreq 参数传入 setsockopt 方法时收到错误
- 使用setsockopt()指定超时选项会导致后续的侦听错误
- setsockopt: c++中错误的文件描述符