Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C SO_时间戳套接字选项使用哪个时钟?_C_Linux_Sockets_Time_Timestamp - Fatal编程技术网

C SO_时间戳套接字选项使用哪个时钟?

C SO_时间戳套接字选项使用哪个时钟?,c,linux,sockets,time,timestamp,C,Linux,Sockets,Time,Timestamp,我每0.1秒从TCP服务器(发送其状态的机器人)接收一个消息流。我不能保证每0.1秒调用一次,因此我希望在收到的消息上有一个时间戳,这样当我recvmsg它们时,我就知道我是否刚刚收到它们,或者它们是否在缓冲区中的时间足够长,已经过时,我应该再次调用recvmsg,直到我读到最近的消息 首先,时间戳的struct timespec使用哪个?我在google上找到了指向CLOCK\u REALTIME的源代码,但它们已经有10年的历史了,所以可能已经过时了 我应该调用哪一个时间函数来获得与时间戳时

我每0.1秒从TCP服务器(发送其状态的机器人)接收一个消息流。我不能保证每0.1秒调用一次,因此我希望在收到的消息上有一个时间戳,这样当我
recvmsg
它们时,我就知道我是否刚刚收到它们,或者它们是否在缓冲区中的时间足够长,已经过时,我应该再次调用
recvmsg
,直到我读到最近的消息

首先,时间戳的
struct timespec
使用哪个?我在google上找到了指向CLOCK\u REALTIME的源代码,但它们已经有10年的历史了,所以可能已经过时了

我应该调用哪一个时间函数来获得与时间戳时间相当的时间

是否可以使用
CLOCK\u BOOTTIME
来避免连续性问题


我犯了一个错误。我将
SO_时间戳
(使用
struct timeval
)与
SO_时间戳
(使用
struct timespec
)(
SO_时间戳
似乎不可用)


虽然
SO\u TIMESTAMPNS
在文档中似乎不可用,但当我
\include
时,我将其定义为
35

更新:文档缺失,因此我编写了它。手册页的5.06版中对此进行了记录


从实验上看,
所以TIMESTAMPNS
起作用,而且它看起来像是在使用
时钟实时

因此,与
SO\u TIMESTAMPNS
一起使用的函数是
clock\u gettime(clock\u REALTIME,&tm)


我不知道它的具体文档,但我做了一些实验:

我编写了一个简单的服务器和客户端测试

在客户端,我连接了一个套接字,指定
SOCK\u-STREAM
“tcp”

然后我在ns中启用了时间戳:

    int     enable = 1;

    if (setsockopt(sd, SOL_SOCKET, SO_TIMESTAMPNS, &enable,
                                                    sizeof(enable)))
            goto err;
然后我准备了msg标题:

    char            buf[BUFSIZ];
    char            cbuf[BUFSIZ];
    struct msghdr   msg;
    struct iovec    iov;

    iov.iov_base    = buf;
    memset(buf, 0, ARRAY_BYTES(buf));
    iov.iov_len     = ARRAY_BYTES(buf) - 1;
    msg.msg_name    = NULL;
    msg.msg_iov     = &iov;
    msg.msg_iovlen  = 1;
    msg.msg_control = cbuf;
    msg.msg_controllen = ARRAY_BYTES(cbuf);
在收到信息之前和之后都会收到一些信息:

    struct timespec tm_before, tm_recvmsg, tm_after, tm_msg;

    clock_gettime(CLOCK_REALTIME, &tm_before);
    usleep(500000);
    clock_gettime(CLOCK_REALTIME, &tm_recvmsg);
    n   = recvmsg(sd, &msg, MSG_WAITALL);
    if (n < 0)
            goto err;
    usleep(1000000);
    clock_gettime(CLOCK_REALTIME, &tm_after);
最后打印结果:

    double      tdiff;

    printf("%s\n", buf);
    tdiff   = timespec_diff_ms(&tm_before, &tm_recvmsg);
    printf("tm_r - tm_b = %lf ms\n", tdiff);
    tdiff   = timespec_diff_ms(&tm_before, &tm_after);
    printf("tm_a - tm_b = %lf ms\n", tdiff);
    tdiff   = timespec_diff_ms(&tm_before, &tm_msg);
    printf("tm_m - tm_b = %lf ms\n", tdiff);
其中印刷:

asdasdfasdfasdfadfgdfghfthgujty 6, 0;

tm_r - tm_b = 500.000000 ms
tm_a - tm_b = 1500.000000 ms
tm_m - tm_b = 18.000000 ms

系统:

Linux debian 5.4.0-4-amd64 #1 SMP Debian 5.4.19-1 (2020-02-13) x86_64 GNU/Linux
gcc (Debian 9.3.0-8) 9.3.0

但是,我没有找到任何关于
的手册页,因此这可能在其他系统上不起作用



我没有测试
所以时间戳
,因为它使用的是
struct timeval
,它使用的是
CLOCK\u REALTIME


吹气。So:
So\u时间戳
在中提到。从那里我跳到了。但就在这个函数的正上方是。他们使用。只需检查中是否使用了
sock\u get\u timestamp
。让人痛心的是,我研究了
ktime\u get\u real
CLOCK\u REALTIME
相同。而且
ktime\u get\u real
也被
使用,但是它们大约有10年的历史了,所以它们可能已经过时了。
-不。关于内核的唯一规则是,它不会破坏用户空间。如果它使用CLOCK_REALTIME,它将继续使用CLOCK_REALTIME。
Linux debian 5.4.0-4-amd64 #1 SMP Debian 5.4.19-1 (2020-02-13) x86_64 GNU/Linux
gcc (Debian 9.3.0-8) 9.3.0