- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在从事一个研究网络同步的项目。因为我想获得最佳性能,所以我尝试将软件时间戳结果与硬件时间戳结果进行比较。
我关注了这个之前评论过的问题:Linux kernel UDP reception timestamp但经过几次测试后,我在尝试获取硬件接收时间戳时遇到了一些问题。
我的场景由 2 个设备组成,一个 PC 和一个 Gateworks Ventana 板,两个设备都应该等待数据包在他们的网络中广播并标记他们的接收时间,我试过这个代码(有些部分已经省略):
int rc=1;
int flags;
flags = SOF_TIMESTAMPING_RX_HARDWARE
| SOF_TIMESTAMPING_RAW_HARDWARE;
rc = setsockopt(sock, SOL_SOCKET,SO_TIMESTAMPING, &flags, sizeof(flags));
rc = bind(sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
struct msghdr msg;
struct iovec iov;
char pktbuf[2048];
char ctrl[CMSG_SPACE(sizeof(struct timespec))];
struct cmsghdr *cmsg = (struct cmsghdr *) &ctrl;
msg.msg_control = (char *) ctrl;
msg.msg_controllen = sizeof(ctrl);
msg.msg_name = &serv_addr;
msg.msg_namelen = sizeof(serv_addr);
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
iov.iov_base = pktbuf;
iov.iov_len = sizeof(pktbuf);
//struct timeval time_kernel, time_user;
//int timediff = 0;
FILE *f = fopen("server.csv", "w");
if (f == NULL) {
error("Error opening file!\n");
exit(1);
}
fprintf(f, "Time\n");
struct timespec ts;
int level, type;
int i;
for (i = 0; i < 10; i++) {
rc = recvmsg(sock, &msg, 0);
for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; cmsg = CMSG_NXTHDR(&msg, cmsg))
{
level = cmsg->cmsg_level;
type = cmsg->cmsg_type;
if (SOL_SOCKET == level && SO_TIMESTAMPING == type) {
//ts = (struct timespec *) CMSG_DATA(cmsg);
memcpy(&ts, CMSG_DATA(cmsg), sizeof(ts));
printf("HW TIMESTAMP %ld.%09ld\n", (long)ts.tv_sec, (long)ts.tv_nsec);
}
}
}
printf("COMPLETED\n");
fclose(f);
close(sock);
return 0;
}
在这两个设备中,我在收到数据包后得到的输出:
HW TIMESTAMP 0.000000000
另一方面,如果使用相同的代码,我的标志是:
flags = SOF_TIMESTAMPING_RX_HARDWARE
| SOF_TIMESTAMPING_RX_SOFTWARE
| SOF_TIMESTAMPING_SOFTWARE;
我得到正确的时间戳:
HW TIMESTAMP 1551721801.970270543
但是,它们似乎是软件时间戳。处理接收到的数据包的硬件时间戳的正确解决方案/方法是什么?
最佳答案
首先,使用ethtool -T "your NIC"
确保您的硬件支持硬件时间戳功能。
您需要明确告诉 Linux 启用您的 NIC 的硬件时间戳功能。为此,您需要调用 ioctl()
。
你要做的就是用SIOCSHWTSTAMP
来调用它,这是一个设备请求代码,表示你想处理哪个设备以及你想做什么。例如,有一个名为CDROMSTOP
的代码可以停止cdrom 驱动器。您还需要使用 ifreq
结构来配置您的 NIC。
你需要这样的东西:
struct ifreq ifconfig;
strncpy(config.ifr_name, "your NIC name", sizeof(ifconfig.ifr_name));
ioctl("your file descriptor" , SIOCSHWTSTAMP, &ifconfig);
以下是您可以查看的一些页面: ioctl manual page , ifreq manual page , Read part 3 .
关于sockets - Linux套接字硬件时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54988917/
给定一个带有多个 date_time 戳的字符串,我想 提取第一个戳及其前面的文本 候选字符串可以有一个或多个时间戳 后续的 date_time 戳记将被 sep="-" 隔开 后续date_time
是否可以合并从相机拍摄的文本和照片?我想在照片上标记日期和时间,但我在 Google 上找不到任何内容。 最佳答案 使用下面的代码来实现你所需要的。 Bitmap src = Bitm
有没有办法通过 Graph API 戳另一个用户?基于this post ,并使用 Graph Explorer ,我发布到“/USERID/pokes”,我已经授予它(Graph API 应用程序和
我有两个向左浮动的元素。一个是 body 的第一个 child ,另一个是容器的第一个 child ,容器是 body 的第二个 child 。 ...
我是一名优秀的程序员,十分优秀!