获取接收数据包的实际大小

时间:2016-07-12 07:59:11

标签: c winsock2

通常在发送任意大小的数据包时,会建立最大值并将其用作接收缓冲区的大小。

#include <winsock2.h>

// Socket Description
// Hint.ai_family = AF_INET;
// Hint.ai_socktype = SOCK_DGRAM;
// Hint.ai_protocol = IPPROTO_UDP;

void Send(int Size)
{
    char *Data = (char *)malloc(Size);
    sendto(Socket, Data, Size, NULL, Result->ai_addr, Result->ai_addrlen)
}

void Receive()
{
    const unsigned int MaxDataSize = 1436;
    char *Data = (char *)malloc(MaxDataSize);
    recvfrom(Socket, Data, MaxDataSize, 0, (SOCKADDR*)&RecvAddr, &RecvAddrSize);
}

在这个伪示例中,无论传递给Send()的数据大小如何,我们的Receive()函数总是以定义的最大大小获取它。

如何确定原始发送的数据包大小?

1 个答案:

答案 0 :(得分:0)

MSDN recvfrom() Documentation

  

如果没有错误发生,recvfrom返回接收的字节数。如果   连接已正常关闭,返回值为零。   否则,返回SOCKET_ERROR的值和特定错误   可以通过调用WSAGetLastError来检索代码。

随后,通过使用MSG_PEEK标志:

  

查看传入的数据。数据被复制到缓冲区但是   没有从输入队列中删除。该函数随后返回   一次调用recvfrom时可以读取的数据量   (或recv)函数,可能与总量不同   套接字上排队的数据。实际可以存储的数据量   读取一次调用recvfrom(或recv)函数仅限于   在send或sendto函数调用中写入的数据大小。

这使您可以灵活地以多个突发方式读取传入的数据包。允许您在发送数据包之前将大小值附加到数据包的开头。然而,这似乎并不像听起来那么微不足道。

我质疑通过此路线获得的任何性能提升,而不是仅仅分配足够的内存来保存您将发送的最大数据包。