繁体   English   中英

使用 SCM_TIMESTAMP 在 macOS 上启用 UDP 数据包时间戳

[英]Enabling UDP packet timestamps on macOS with SCM_TIMESTAMP

我尝试在 macOS(和 iOS)上启用硬件 UDP 数据包时间戳,但无法正常工作(在 macOS 10.13.4、Xcode 9.3 上工作)。

我的目标是为传出和传入 UDP 数据包获得尽可能精确的时间戳,理想情况下相当于可以在 Linux 上使用SO_TIMESTAMPNS请求的纳秒时间戳

下面的示例适用于 Linux,但不适用于 macOS,其中尝试请求SCM_TIMESTAMP选项失败,返回码为-1SCM_TIMESTAMP setsockopt()调用。

我知道 macOS 中的套接字实现遵循 POSIX(因此不希望SO_TIMESTAMPNS工作),但我很惊讶我SCM_TIMESTAMP至无法让SCM_TIMESTAMP工作(也是因为我在我的sys/socket.h找到了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 时间戳功能应该是在不久前添加到 NetBSD 的,但在 macOS 上找不到任何信息。

您正在寻找的常量是SO_TIMESTAMP SCM_TIMESTAMP是用于指定A S OCKET级呼叫控制中号essage类型。 SO_TIMESTAMP用于指定A S OCKETØption。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM