timeval设置recvfrom超时时间,tv_sec单位是毫秒?

Fuxiao0510 2017-10-31 06:55:22
在设置recvfrom超时的时候,发现结构体timeval中的tv_sec是毫秒
timeval tv;
memset((void *)&tv, 0, sizeof(tv));
tv.tv_sec = 5000;
tv.tv_usec = 0;
这样是5秒超时,如果设置tv.tv_sec = 5; 发现在不停刷屏。。。

是什么原因?
...全文
2867 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Fuxiao0510 2017-11-01
  • 打赏
  • 举报
回复
引用 1 楼 year2002 的回复:
估计是因为你这个地方tv_sec表示的是time_t的时间格式 感觉5和5000应该是一样的呀,都是1970年1月1日0点加上5秒或者5000秒 我也纳闷了
我在win10 64位系统上写的代码,在vs2010里查看了下头文件: /* * Structure used in select() call, taken from the BSD file sys/time.h. */ struct timeval { long tv_sec; /* seconds */ long tv_usec; /* and microseconds */ }; 是long类型的,注释上是s,但是实际测试下来表现的是ms
  • 打赏
  • 举报
回复
估计是因为你这个地方tv_sec表示的是time_t的时间格式 感觉5和5000应该是一样的呀,都是1970年1月1日0点加上5秒或者5000秒 我也纳闷了
  • 打赏
  • 举报
回复
引用 2 楼 Fuxiao0510 的回复:
[quote=引用 1 楼 year2002 的回复:] 估计是因为你这个地方tv_sec表示的是time_t的时间格式 感觉5和5000应该是一样的呀,都是1970年1月1日0点加上5秒或者5000秒 我也纳闷了
我在win10 64位系统上写的代码,在vs2010里查看了下头文件: /* * Structure used in select() call, taken from the BSD file sys/time.h. */ struct timeval { long tv_sec; /* seconds */ long tv_usec; /* and microseconds */ }; 是long类型的,注释上是s,但是实际测试下来表现的是ms[/quote] 我很好奇地去查了下文档 不清楚你是怎么设置的超时,如果是用select函数,那应该没有这个问题,这个我是用过的 如果你是用setsockopt的SO_RCVTIMEO属性设置的超时 看这个地址上的说明https://msdn.microsoft.com/en-us/library/ms740476(VS.85).aspx SO_RCVTIMEO DWORD Sets the timeout, in milliseconds, for blocking receive calls. 很明显,那就是毫秒,因为那个参数是const char*类型 你传进去多少它也只取DWORD大小 你传一个timeval进去,实际上它也只取了tv_sec字段,然后转换成了毫秒数
自信男孩 2017-11-01
  • 打赏
  • 举报
回复
引用 2 楼 Fuxiao0510 的回复:
[quote=引用 1 楼 year2002 的回复:] 估计是因为你这个地方tv_sec表示的是time_t的时间格式 感觉5和5000应该是一样的呀,都是1970年1月1日0点加上5秒或者5000秒 我也纳闷了
我在win10 64位系统上写的代码,在vs2010里查看了下头文件: /* * Structure used in select() call, taken from the BSD file sys/time.h. */ struct timeval { long tv_sec; /* seconds */ long tv_usec; /* and microseconds */ }; 是long类型的,注释上是s,但是实际测试下来表现的是ms[/quote] 不用怀疑这个结构体变量tv_sec是秒还是毫秒,这个结构体大家都在用,并且已经是经过大家的验证过得,是秒就不可能是毫秒;还是要检查自己的代码逻辑。
自信男孩 2017-11-01
  • 打赏
  • 举报
回复
引用 2 楼 Fuxiao0510 的回复:
[quote=引用 1 楼 year2002 的回复:] 估计是因为你这个地方tv_sec表示的是time_t的时间格式 感觉5和5000应该是一样的呀,都是1970年1月1日0点加上5秒或者5000秒 我也纳闷了
我在win10 64位系统上写的代码,在vs2010里查看了下头文件: /* * Structure used in select() call, taken from the BSD file sys/time.h. */ struct timeval { long tv_sec; /* seconds */ long tv_usec; /* and microseconds */ }; 是long类型的,注释上是s,但是实际测试下来表现的是ms[/quote] 那是不可能的,注释上是s(秒)那么就是second(秒)不可能是毫秒的,如果不停的刷屏,那么建议检查代码逻辑,很有可能是出在代码逻辑上,而不是这个结构体里的秒还是毫秒;

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧