套接字SO_RCVTIMEO超时是C++/VC++中设置值的两倍
Socket SO_RCVTIMEO Timeout is double the set value in C++/VC++
请显示以下示例
int val = 120000;
setsockopt(connSock,SOL_SOCKET,SO_RCVTIMEO,(char*)&val,sizeof(int));
我在接收超时时设置了120秒,但它需要240秒。
我认为超时是设定值的两倍。
这怎么可能?
SO_RCVTIMEO
不接受int
作为超时。你正在寻找这样的东西:
struct timeval tv = {
.tv_sec = 120
};
setsockopt(connSock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
SO_RCVTIMEO和SO_SNDTIMEO不适用于所有套接字操作,您应该使用非阻塞模式和select
。
行为可能会在不同的操作系统配置上发生变化。在我的系统上,connect
在两倍于我在SO_RCVTIMEO中设置的值后超时。一个快速的破解方法,比如在连接前将SO_RCVTIMEO设置为x/2
,在连接后设置为x
,但正确的解决方案是使用select。
参考文献
关于这个问题的讨论(阅读评论以回答):
- https://stackoverflow.com/a/4182564/4074995
如何使用选择来获得所需的结果:
- http://beej.us/guide/bgnet/output/html/multipage/advanced.html#select
- C: 套接字连接超时
相关文章:
- 重复使用预分配的向量<复杂<double>>作为<double>长度两倍的向量
- 如何使用 pthreads 以正确的方式设置两个线程之一的优先级
- 计算C++两倍的差值
- 为什么当我进入退出条件时,程序会打印两倍的默认条件而不是退出 while 循环?
- 内存移动的性能与memcpy相比是两倍?
- Qt 是 JSON 精度的两倍
- 不完整的多线程光线追踪器花费的时间是预期的两倍
- C++随机函数给出的相同整数是输出的两倍
- 为什么我的最终向量是它应该大小的两倍并且具有前导 0?
- 为什么即使在从int到两倍的类型施放后,小数也没有小数
- 如何将固定精度的两倍格式化为给定的长度
- getsockopt() 返回的值是之前由 setsockopt() 设置的值的两倍
- MF SinkWriter mp4文件的播放持续时间是添加音频样本时的一半,图像的播放速度也是添加音频样本的两倍
- 无论如何,是否可以使用setCursorPos(int,int)函数,但没有采用两个int使它需要速度较慢的两倍
- 是一个包含两个INT(只有两个INT)的结构,保证是大小(INT)的两倍
- C++ "time.h"测量的运行时间是实际值的两倍
- 退出申请致电两倍
- SSE42 & STTNI - PcmpEstrM比PcmpIstrM慢两倍,是真的吗?
- 在同一台机器上,是否保证两倍值的不精确性是一致的
- 套接字SO_RCVTIMEO超时是C++/VC++中设置值的两倍