0

UDPソケットでフラグMSG_TRUNC、MSG_CTRUNCを使用するCの完全な例と、これらのフラグの説明が必要です

recvmsg(udpSocket, &msg, flags);
if (msg.msg_flags & MSG_TRUNC)
printf("MSG_TRUNC\n");

ありがとう

4

1 に答える 1

3

MSG_TRUNC受信用に用意されたバッファスペースが不足していたため、一部のパケットデータが失われたことを示します。このフラグは、切り捨てられたデータの量を検出する場合に使用されます。この関数は、構造体(UDPパケットの送信に使用される)にrecvmsgこのフラグ()を設定しますmsg_flagsmsghdr

struct msghdr {
       void                  *msg_name;
       int                   msg_namelen;
       struct iovec          *msg_iov;
       __kernel_size_t       msg_iovlen;
       void                  *msg_control;
       __kernel_size_t       msg_controllen;
       unsigned              msg_flags;
};

この構造体をコードに追加する必要があります。

struct msghdr msg;
struct iovec iov;

そしてあなたの受信バッファ:

char buffer[BUFFER_SIZE];

このすべてのものを初期化します:

iov.iov_base = buffer;
iov.iov_len = sizeof(buffer);

msg.msg_iov = iov;

呼び出し時に、バッファーセットの最大サイズとフラグMSG_TRUNCが設定されている場合:

recvmsg(udpSocket, &msg, flags);

この呼び出しの後に構造体ヘッダーが入力され、受信したバッファーが切り捨てられたかどうかを次のように確認できます。

if (msg.msg_flags & MSG_TRUNC)
printf("MSG_TRUNC\n");

編集:recvfromを使用する

これは、フラグでrecvfromを使用する方法のサンプルです。

char *buffer[BUFFER_MAX_SIZE]; 
struct sockaddr from;
socklen_t from_len;
int available_data;
int socket;

socket = socket(AF_INET, SOCK_DGRAM, 0);

available_data = recvfrom(socket, (char*)buffer,0, MSG_TRUNC, &from, &fromlen);
if(available_data > 0)
{
    if (available_data > BUFFER_MAX_SIZE) 
    {
        fprintf(stderr, "UDP Packet is bigger than expected\n"); 

        exit(EXIT_FAILURE);
    }

    else 
    { 
        /* Process receiving data */ 
    }
}
else
{
    /* Handle error */
}
于 2012-08-08T15:32:01.360 に答える