1

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 ソケット バッファ内のすべてのバイトを返すことを期待していましたが、バッファ内にさらにバイトがあるにもかかわらず、毎回 1 つのパケット (120 バイト) しか返されないようです。 . だから今、私はパケット損失に遭遇しました。この問題を解決するには他にも多くの方法があることは知っていますが、今のところ、UDP バッファーに存在するすべてのバイトを一度に読み取ることが、私にとって最も簡単な方法です。では、UDP バッファ内のすべてのバイトを一度に読み取る方法はありますか?

前もって感謝します

4

1 に答える 1

1

UDP はメッセージ指向のプロトコルであるため、1 回の recv 操作で 1 つのメッセージを取得します。recvmmsg() システム コールを使用して、1 回の呼び出しで複数のメッセージを受信できます。

于 2016-01-16T14:52:15.227 に答える