【问题标题】:Boost time stamping UDP packets提升时间戳UDP数据包
【发布时间】:2017-01-22 15:37:12
【问题描述】:

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

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

我使用的是 boost 1.60.0,但无法启用此选项:

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

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

【问题讨论】:

    标签: c++ boost udp asio


    【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-17
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-01
      • 2010-12-16
      • 1970-01-01
      相关资源
      最近更新 更多