簡體   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