0

我想要一个在 C 中使用标志 MSG_TRUNC , MSG_CTRUNC 在 UDP 套接字中的完整示例以及对这些标志的一些解释

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

谢谢

4

1 回答 1

3

MSG_TRUNC表示为接收提供的缓冲区空间不足,导致部分数据包数据丢失。当您想要发现有多少数据被截断时使用此标志。该recvmsg函数将为结构设置此标志(msg_flagsmsghdr(用于发送UDP数据包)

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 回答