我在 Fedora 25 上。在下面的测试程序中,我使用 setsockopt
将接收超时设置为 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
[ ~]$
最佳答案
根据内核sources :当设置 SO_RCVTIMEO
时,将 struct tv
转换为 long
值,对 HZ
值使用算术。另一方面,当检索 SO_RCVTIMEO
值时,struct tv
是根据 long
值构造的。因此,结果取决于时间分辨率(HZ
值)以及算术除法和模数。
关于c - 为什么 SO_RCVTIMEO 超时在设置后会有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42536919/