【问题标题】:Enabling UDP packet timestamps on macOS with SCM_TIMESTAMP使用 SCM_TIMESTAMP 在 macOS 上启用 UDP 数据包时间戳
【发布时间】: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


    【解决方案1】:

    您要查找的常量是SO_TIMESTAMPSCM_TIMESTAMP 用于指定 S 套接字级 C 控制 M 消息类型。 SO_TIMESTAMP 用于指定一个S套接字O选项。

    附带说明一下,在代码 sn-p 的末尾打印 optval 和 len,但即使 setsockopt 和 getsockopt 有效,您也将始终在此处打印 0 0。通过将指向0 的指针作为getsockopt 的最后一个参数传递给它,您可以告诉它倒数第二个参数(optval)的缓冲区大小为0,从而完全禁止它使用它。如果您将 len 设置为 sizeof(int),它会将您指定的选项的值复制到 optval 中,正如您所期望的那样。

    【讨论】:

    • 我意识到这个问题已经存在多年了,所以这对于提出这个问题的人来说可能不是有用的信息,但对于偶然发现这个问题的其他人来说仍然可能是有用的信息(就像它会当我发现问题时一直找我)
    猜你喜欢
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多