【问题标题】:What is the maximum number of bytes WSARecv can receive at one time?WSARecv 一次可以接收的最大字节数是多少?
【发布时间】:2012-07-25 14:16:44
【问题描述】:

我正在使用 std::vector 来表示每个 IO 数据结构中的缓冲区:

struct PerIoData 
{
    WSAOVERLAPPED m_overlapped;
    SOCKET m_socket;
    WSABUF m_wsaBuf;
    std::vector<BYTE> m_vecBuffer;
    DWORD m_dwFlags;
    DWORD m_dwNumberOfBytesSent;
    DWORD m_dwNumberOfBytesToSend;
    eOperationType m_operationType;
};

...
...
if (WSARecv(pPerIoData->m_socket, &(pPerIoData->m_wsaBuf), 1, &dwNumberOfBytesReceived, &(pPerIoData->m_dwFlags), &(pPerIoData->m_overlapped), NULL) == 0)
    continue;

我想在调用 WSARecv() 后指定最大大小并在 m_vecBuffer 上执行“缩小以适应”。

我查看了this page,但找不到我要查找的信息。

【问题讨论】:

  • 那不需要内存释放吗?我尽量避免在网络服务器中出现这种情况。我使用普通数组,从不调整它们的大小。我不知道最大大小是多少,但它超过了256K。很可能是 32 位系统上的 4G,(好吧,实际上不太可能:)。
  • 查看this answer
  • @Littlegator-感谢您的链接!

标签: c++ sockets winsock2 iocp


【解决方案1】:

传递给WSARecv()WSABUF 结构指定了一个指向WSARecv() 读取字节的缓冲区的指针,以及可以读入该缓冲区的最大字节数。当WSARecv() 完成它的工作时,它会报告实际读入缓冲区的字节数。如果使用vector 作为缓冲区,则必须将向量预分配为所需的最大大小,然后将WSABUF::buf 设置为指向向量的内部存储器,将WSABUF::len 设置为向量的分配大小,然后然后将向量调整为 WSARecv() 报告的新值。

【讨论】:

  • 是的,这正是我要做的。干杯雷米。
猜你喜欢
  • 2013-01-01
  • 2023-03-31
  • 2020-01-02
  • 2016-08-27
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
相关资源
最近更新 更多