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 одновременно?

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

1 ответ

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

Другие вопросы по тегам