【发布时间】:2018-11-30 05:48:09
【问题描述】:
我尝试在 macOS(和 iOS)上启用硬件 UDP 数据包时间戳,但无法使其正常工作(在 macOS 10.13.4、Xcode 9.3 上工作)。
我的目标是为传出和传入的 UDP 数据包获取尽可能精确的时间戳,理想情况下相当于 the nanosecond timestamps that can be requested with SO_TIMESTAMPNS on Linux。
下面的示例适用于 Linux,但不适用于 macOS,其中尝试请求 SCM_TIMESTAMP 选项失败,-1 返回代码到 setsockopt() 调用。
我知道 macOS 中的套接字实现遵循 POSIX(因此不要指望 SO_TIMESTAMPNS 工作),但我很惊讶我什至无法让 SCM_TIMESTAMP 工作(也是因为我找到了定义SCM_TIMESTAMP 在我的sys/socket.h):
// testing SCM_TIMESTAMP
#include <stdio.h>
#include <sys/socket.h>
int main() {
// open socket
int sd, ret, optval;
socklen_t len;
sd = socket(AF_INET, SOCK_DGRAM, 0);
if (sd < 0) {
fprintf(stderr, "failed to open socket: %d\n", sd);
return 1;
}
// set SCM_TIMESTAMP
optval = 1;
ret = setsockopt(sd, SOL_SOCKET, SCM_TIMESTAMP, &optval, sizeof(optval));
if (ret < 0) {
fprintf(stderr, "request for setting SCM_TIMESTAMP failed: %d\n", ret);
return 1;
}
// get SCM_TIMESTAMP
optval = 0;
len = 0;
ret = getsockopt(sd, SOL_SOCKET, SCM_TIMESTAMP, &optval, &len);
if (ret < 0) {
fprintf(stderr, "request for getting SCM_TIMESTAMP failed: %d\n", ret);
return 1;
}
fprintf(stderr, "SCM_TIMESTAMP: %d %d\n", optval, len);
return 0;
}
我有什么明显的遗漏吗?我可以在 macOS 和 iOS 上获得的最精确的时间戳是什么?
感谢任何帮助!
编辑:
我发现了 UDP 时间戳功能 was supposedly added to NetBSD a while ago,但在 macOS 上找不到任何信息。
【问题讨论】:
标签: c macos network-programming posix setsockopt