C — Чтение байтов из буфера сокета UDP (Linux)

Я написал код для обработки получения UDP-пакетов. Все пакеты имеют одинаковую длину (120 байт), и каждую секунду приходит около 1000 пакетов. Просто мой код такой.

int sock = -1;
int flag = 0;
int nRead = 0;

#define LOCAL_BUFF_SIZE (8192)
char buff[LOCAL_BUFF_SIZE];

struct sockaddr_in sockAddr;

memset((void *)&sockAddr, 0x00, sizeof(struct sockaddr_in));

if((sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
{
    /* Print error and terminate */
}

/* Make it non-blocking */  
flag = fcntl( sock, F_GETFL, 0 );
fcntl( sock, F_SETFL, flag | O_NONBLOCK );

sockAddr.sin_family = AF_INET;
sockAddr.sin_port = htons(portNum);
sockAddr.sin_addr.s_addr = INADDR_ANY;

if(bind(sock, (struct sockaddr *)&sockAddr, sizeof (sockAddr)) < 0)
{
    /* Print error and terminate */
}

while(...)
{
    nRead = recv(sock, buff, LOCAL_BUFF_SIZE, 0);
    if(nBytes > 0)
    {
        /* Process the data */
    }
    else
    {
        /* If it's error, handle error */
    }
}

Когда я писал этот код, я ожидал, что функция recv() возвращает все байты в буфере сокета UDP в этот момент, но кажется, что она каждый раз возвращает только один пакет (120 байт), даже если в буфере больше байтов. . Итак, теперь я столкнулся с потерей пакетов. Я знаю, что есть много других способов решить эту проблему, но на данный момент чтение всех существующих байтов в буфере UDP за раз — это самый простой способ для меня. Итак, есть ли способ прочитать все байты в буфере UDP сразу?

заранее спасибо


person Youngchai Kim    schedule 16.01.2016    source источник


Ответы (1)


UDP — это протокол, ориентированный на сообщения, поэтому вы получаете одно сообщение за одну операцию recv. Вы можете использовать системный вызов recvmmsg() для получения нескольких сообщений за один вызов.

person Arun Kaushal    schedule 16.01.2016
comment
Спасибо. Это то, что я искал. - person Youngchai Kim; 17.01.2016