WSARecv一次可以接收的最大字节数是多少?

时间:2012-07-25 14:16:45

标签: c++ sockets winsock2 iocp

我正在使用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上执行“shrink to fit”。

我看过this page,但无法找到我正在寻找的信息。

1 个答案:

答案 0 :(得分:1)

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