【发布时间】:2017-03-01 16:25:14
【问题描述】:
我在 Fedora 25 上。在以下测试程序中,我使用 setsockopt 将 recv 超时设置为 12 秒、12345 微秒。但是当我使用getsockopt 获得超时值时,我得到的值略有不同:12 秒,13000 微秒。我希望它与setsockopt 设置的相同。
为什么不一样?
[ ~]$ cat sockopt.c
#include <stdio.h>
#include <sys/time.h>
#include <sys/socket.h>
int main()
{
int sd = socket(AF_INET, SOCK_STREAM, 0);
int rc;
struct timeval tv;
socklen_t len = sizeof(tv);
tv.tv_sec = 12;
tv.tv_usec = 12345;
rc = setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
if (rc < 0) printf("oops\n");
rc = getsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, &tv, &len);
if (rc < 0) printf("oops\n");
printf("%ld, %ld\n", tv.tv_sec, tv.tv_usec);
}
[ ~]$
[ ~]$ gcc -Wall sockopt.c
[ ~]$
[ ~]$ ./a.out
12, 13000
[ ~]$
【问题讨论】:
-
可能系统没有您要求的分辨率,可能会向上取整到最接近的微秒?
-
@Someprogrammerdude:实际上是四舍五入到最接近的毫秒,问题提到的毫秒不正确,
tv_usec以微秒为单位。 -
@BenVoigt,谢谢,编辑了问题。