C SO_时间戳套接字选项使用哪个时钟?
我每0.1秒从TCP服务器(发送其状态的机器人)接收一个消息流。我不能保证每0.1秒调用一次,因此我希望在收到的消息上有一个时间戳,这样当我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年的历史了,所以可能已经过时了 我应该调用哪一个时间函数来获得与时间戳时
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