我想要一个在 C 中使用标志 MSG_TRUNC , MSG_CTRUNC 在 UDP 套接字中的完整示例以及对这些标志的一些解释
recvmsg(udpSocket, &msg, flags);
if (msg.msg_flags & MSG_TRUNC)
printf("MSG_TRUNC\n");
谢谢
MSG_TRUNC
表示为接收提供的缓冲区空间不足,导致部分数据包数据丢失。当您想要发现有多少数据被截断时使用此标志。该recvmsg
函数将为结构设置此标志(msg_flags
)msghdr
(用于发送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 */
}