2

我想检索使用 boost asio 接收的 UDP 数据包的接收时间戳。

我发现内核提供了套接字选项SO_TIMESTAMP,它应该允许在 NIC 接收到数据包时生成时间戳。我还发现了这张旧,它提出了一个补丁来添加对 SO_TIMESTAMP 的支持。

我正在使用 boost 1.60.0,但无法启用此选项:

ip::udp::socket sock; 
... 
sock.set_option(ip::unicast::timestamp(true));

当我通过同步或异步读取接收数据包时,如何使用 boost 检索 UDP 数据包接收时间并计算自接收以来经过的时间?

4

1 回答 1

1

似乎 boost 还没有实现这个选项,如果你的平台支持辅助数据,你可以使用本机套接字来实现:

int socket = sock.native(); 
int opt = 1;
setsockopt( sock, SOL_SOCKET, SO_TIMESTAMP, &opt, sizeof(opt));

然后从本机套接字访问控制消息:

int received = recvmsg(socket, &msgh, 0);
struct msghdr msgh;
struct cmsghdr *cmsg;
for (cmsg = CMSG_FIRSTHDR(msgh); cmsg != NULL; cmsg = CMSG_NXTHDR(msgh, cmsg)) {
    if ((cmsg->cmsg_level == SOL_SOCKET ) &&(cmsg->cmsg_type == SO_TIMESTAMP ))
        // read the timestamp
}
于 2017-01-24T15:54:12.697 回答