Переход от recvfrom () к recvmsg () увеличивает потерю пакетов - PullRequest
2 голосов
/ 15 января 2020

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

Изначально я использовал 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() редко теряет пакеты, поэтому у меня должна быть ошибка или недоразумение.

Может кто-нибудь увидеть что-то, что могло бы объяснить это?

...