Я слушаю многоадресный канал. Каждый пакет содержит порядковый номер, поэтому я знаю, когда получаю неожиданный пакет.
Изначально я использовал recvfrom()
, но я хотел получить временную метку NI C, поэтому я изменил на recvmsg()
.
Когда я использую recvfrom()
Я редко пропускаю пакеты:
while(1)
{
const size_t maxNumBytesToRead = MSGBUFSIZE - 1;
socklen_t addrlen = sizeof(_sin);
const int nbytes = recvfrom(sock, _msgbuf, maxNumBytesToRead, 0, (struct sockaddr *) &_sin, &addrlen);
где:
#define MSGBUFSIZE 1500
char _msgbuf[MSGBUFSIZE];
struct sockaddr_in _sin;
Однако, когда я конвертирую свой код в использование recvmsg()
, я теряю много пакетов:
while(1)
{
struct msghdr msg;
struct iovec iov;
char control[1024];
iov.iov_base = _msgbuf;
iov.iov_len = MSGBUFSIZE;
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
msg.msg_name = &_sin;
msg.msg_namelen = sizeof(struct sockaddr_in);
msg.msg_control = control;
msg.msg_controllen = 1024;
const int nbytes = recvmsg(sock, &msg, 0);
Код, следующий за recvfrom()
и recvmsg()
, декодирует пакеты и идентичен.
Я переключаюсь между двумя вариантами, а recvmsg()
ВСЕГДА теряет пакеты и recvfrom()
редко теряет пакеты, поэтому у меня должна быть ошибка или недоразумение.
Может кто-нибудь увидеть что-то, что могло бы объяснить это?