2016-01-16 5 views
1

Я написал код, чтобы обрабатывать прием UDP-пакетов. Пакеты имеют одинаковую длину (120 байт), и около 1000 пакетов поступают каждую секунду. Просто мой код такой.C - Чтение байтов из буфера сокета UDP (Linux)

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 является сообщение ориентированный протокол, таким образом, вы получаете одно сообщение в одной операции ПРИЕМ. Вы можете использовать системный вызов recvmmsg() для приема нескольких сообщений за один раз.

+0

спасибо. Это то, что я искал. –