UDPソケットでフラグMSG_TRUNC、MSG_CTRUNCを使用するCの完全な例と、これらのフラグの説明が必要です
recvmsg(udpSocket, &msg, flags);
if (msg.msg_flags & MSG_TRUNC)
printf("MSG_TRUNC\n");
ありがとう
MSG_TRUNC
受信用に用意されたバッファスペースが不足していたため、一部のパケットデータが失われたことを示します。このフラグは、切り捨てられたデータの量を検出する場合に使用されます。この関数は、構造体(UDPパケットの送信に使用される)にrecvmsg
このフラグ()を設定しますmsg_flags
msghdr
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 */
}