Повышение отметки времени UDP-пакетов

Я хотел бы получить временную метку приема для пакетов UDP, полученных с помощью boost asio.

Я обнаружил, что ядро ​​предоставляет опцию сокета SO_TIMESTAMP что должно позволить генерировать метку времени, когда пакеты принимаются NIC.
Я также нашел этот старый билет который предлагал патч для добавления поддержки SO_TIMESTAMP.

Я использую Boost 1.60.0, и я не мог включить эту опцию:

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

Как я могу получить время приема пакета UDP с повышением и вычислить истекшее время с момента получения, когда я получаю пакет с синхронным или асинхронным чтением?

2

Решение

Кажется, в 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
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]