簡體   English   中英

C-從UDP套接字緩沖區讀取字節(Linux)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM