通常在发送任意大小的数据包时,会建立最大值并将其用作接收缓冲区的大小。
#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()
函数总是以定义的最大大小获取它。
如何确定原始发送的数据包大小?
答案 0 :(得分:0)
如果没有错误发生,recvfrom返回接收的字节数。如果 连接已正常关闭,返回值为零。 否则,返回SOCKET_ERROR的值和特定错误 可以通过调用WSAGetLastError来检索代码。
随后,通过使用MSG_PEEK
标志:
查看传入的数据。数据被复制到缓冲区但是 没有从输入队列中删除。该函数随后返回 一次调用recvfrom时可以读取的数据量 (或recv)函数,可能与总量不同 套接字上排队的数据。实际可以存储的数据量 读取一次调用recvfrom(或recv)函数仅限于 在send或sendto函数调用中写入的数据大小。
这使您可以灵活地以多个突发方式读取传入的数据包。允许您在发送数据包之前将大小值附加到数据包的开头。然而,这似乎并不像听起来那么微不足道。
我质疑通过此路线获得的任何性能提升,而不是仅仅分配足够的内存来保存您将发送的最大数据包。