如何通过setsockopt()禁用套接字接收超时?附C++设置代码
如何禁用套接字的SO_RCVTIMEO接收超时?
要禁用之前设置的套接字接收超时,其实很简单——你只需要把timeval结构体的秒数和微秒数都设为0,然后再次调用setsockopt()就可以了。
具体代码实现
struct timeval time_val_struct = {0}; // 将tv_sec和tv_usec都设为0,代表禁用超时 time_val_struct.tv_sec = 0; time_val_struct.tv_usec = 0; int return_value = setsockopt(this->m_fdSocket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&time_val_struct, sizeof(time_val_struct)); if (return_value == -1) { // 可根据需求添加错误处理逻辑,比如打印errno排查问题 return; }
原理说明
POSIX标准明确规定:当SO_RCVTIMEO对应的timeval结构体两个字段均为0时,就表示取消接收超时设置,套接字会恢复到默认的无超时状态(如果之前是阻塞模式就回到阻塞,非阻塞模式则保持非阻塞但不再有超时限制)。
你之前通过给tv_sec赋值1设置了1秒超时,现在把两个字段都清零后调用setsockopt(),就会覆盖之前的超时配置,回到最初的无超时状态。
小提示
- 必须确保
tv_sec和tv_usec都被设为0,只设置其中一个无法达到禁用超时的效果; - 调用
setsockopt()后记得检查返回值,若返回-1可通过errno查看具体错误(比如套接字无效、权限不足等)。
内容的提问来源于stack exchange,提问作者A. Smoliak
相关产品推荐
相关产品推荐

