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

#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/

10-12 16:12
查看更多