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() для получения нескольких сообщений за один вызов.