通常,在发送任意大小的数据包时,会建立一个最大值并将其用作接收缓冲区的大小。
#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()
函数始终以定义的最大大小来获取它。如何确定原始发送数据包的大小?
最佳答案
MSDN recvfrom() Documentation
如果未发生错误,则recvfrom返回接收到的字节数。如果
连接已正常关闭,返回值为零。
否则,将返回SOCKET_ERROR的值,并返回特定错误
可以通过调用WSAGetLastError来检索代码。
随后,通过使用MSG_PEEK
标志:
窥视传入的数据。数据被复制到缓冲区中,但是
没有从输入队列中删除。该函数随后返回
一次调用recvfrom可以读取的数据量
(或recv)功能,该功能可能与
数据在套接字上排队。实际可以存储的数据量
在对recvfrom(或recv)函数的单次调用中读取的内容仅限于
写在send或sendto函数调用中的数据大小。
这使您可以灵活地读取多个突发中的传入数据包。允许您在发送数据包之前将大小值附加到数据包的开头。但是,这听起来并不那么琐碎。
我质疑通过这种方式获得的性能提升,而不是直接分配足够的内存来容纳您将要发送的最大数据包。
关于c - 获取接收到的数据包的实际大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38323099/