我编写代码以处理接收UDP数据包。数据包长度相同(120字节),每秒大约有1,000个数据包。简单地说,我的代码是这样的。
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缓冲区中的所有字节?
提前致谢
答案 0 :(得分:1)
UDP是面向消息的协议,因此,您在一次recv操作中获得单个消息。您可以使用recvmmsg()系统调用在一次调用中接收多条消息。