2016-01-16 127 views
1

我编写了代码以处理接收UDP数据包。这些数据包的长度都是相同的(120字节),每秒大约有1,000个数据包。简单地说,我的代码就是这样。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是一个面向消息的协议,因此,要在一个的recv操作得到单个消息。您可以使用recvmmsg()系统调用在一次调用中接收多条消息。

+0

谢谢。这正是我所期待的。 –