[英]C - Read bytes from the UDP socket buffer (Linux)
我編寫了代碼以處理接收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緩沖區中的所有字節?
提前致謝
UDP是一種面向消息的協議,因此,您可以通過一個recv操作獲得單個消息。 您可以使用recvmmsg()系統調用在一個調用中接收多個消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.