c - 为什么 SO_RCVTIMEO 超时在设置后会有所不同?

标签 c linux sockets tcp

我在 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/

相关文章:

Python线程给出全局名称未定义错误

ios - 从 Socket 接收批量数据时应用卡住。 iOS |套接字。 Realm swift

c - Shell_NotifyIcon() 和一个不可见的窗口

c - 为什么不能更改代码中的行顺序?

linux - 使用 wget 或 curl(首选 Wget)下载带有引用目录最后一部分名称的文件,而不是真实文件名

linux - 在 Linux 上安装 perforce 可视化客户端

c# - 如果连接意外断开,则无法处理SocketStream上的应用程序崩溃

c - 如何计算数组的最小值、最大值、平均值?

c - 我什么时候应该使用地址为 '&' & 符号键的 scanf ?

php - "get_current_user()"函数可以在 Linux/OSX 上运行吗?