【发布时间】:2015-03-05 00:10:57
【问题描述】:
我不确定在使用 IOCP 时如何初始化 WSAOVERLAPPED。我认为我根本不需要初始化它,我只将WSAOVERLAPPED.hEvent 设置为 NULL(也不确定这是否有必要)。这段代码是否正确:
// Send data
char buffer[1024];
WSABUF wsaBuf;
wsaBuf.buf = buffer;
wsaBuf.len = 1024;
WSAOVERLAPPED wsaOverlapped;
wsaOverlapped.hEvent = NULL;
WSASend(s, &wsaBuf, 1, NULL, 0, &wsaOverlapped, NULL);
另外,在使用WSARecv() 时初始化OVERLAPPED 是否与初始化WSAOVERLAPPED 相同?
【问题讨论】:
-
您显示的代码已损坏。数据缓冲区和
OVERLAPPED必须都有效,直到重叠发送完成并从 IOCP 中提取完成。只有 WSABUF 可以基于堆栈并且仅在WSASend()API 调用期间存在。 -
@Len Holgate 所以
buffer和wsaOverlapped应该在堆上创建? -
是的。理想情况下,使用某种池分配器可以让您重用它们,而不是直接在堆上。
标签: c++ sockets winapi network-programming iocp