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

标签 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 执行“收缩以适合”。

我看过this page但无法找到我要查找的信息。

最佳答案

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

关于c++ - WSARecv 一次可以接收的最大字节数是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11651829/

相关文章:

c++ - 使用 ofstream 写入二进制数据时出现问题

c++ - SSE - 从 double 到 char 的 AVX 转换

C服务器连接到客户端

delphi - GetMem 用于一个 PChar 变量更改其他 PChar 变量的内容

c - C 中的 HTTP : Why do I have to call recv() multiple times?

c++ - C++ main() 的第三个环境变量参数有什么用?

c++ - 在 OpenGL/GLSL 中绘制镶嵌的 LineLoops

java - 当socketChannel.read(BUFFER)将返回0时

java - Node.js 套接字上的数据太多?

c++ - 在 C++ 中使用套接字进行文件传输