Я хотел бы получить временную метку приема для пакетов UDP, полученных с помощью boost asio.
Я обнаружил, что ядро предоставляет опцию сокета SO_TIMESTAMP что должно позволить генерировать метку времени, когда пакеты принимаются NIC.
Я также нашел этот старый билет который предлагал патч для добавления поддержки SO_TIMESTAMP.
Я использую Boost 1.60.0, и я не мог включить эту опцию:
ip::udp::socket sock;
...
sock.set_option(ip::unicast::timestamp(true));
Как я могу получить время приема пакета UDP с повышением и вычислить истекшее время с момента получения, когда я получаю пакет с синхронным или асинхронным чтением?
Кажется, в 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
}
Других решений пока нет …