Я не уверен, как инициализировать WSAOVERLAPPED
при использовании IOCP. Я не думаю, что мне нужно инициализировать его вообще, я установил только WSAOVERLAPPED.hEvent
в NULL (не уверен, что это необходимо). Является ли этот код правильно:Как инициализировать WSAOVERLAPPED при использовании IOCP?
// 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);
Кроме того, инициализирует OVERLAPPED
при использовании WSARecv()
такой же, как инициализируется WSAOVERLAPPED
?
Код, который вы показываете, сломан. Буфер данных и «OVERLAPPED» должны быть действительными до тех пор, пока наложенная отправка не завершится, а завершение будет извлечено из IOCP. ТОЛЬКО WSABUF может быть основан на стеке и существовать исключительно на время вызова API WSASend(). –
@Len Holgate Итак, 'buck' и' wsaOverlapped' должны быть созданы в куче? –
Да. В идеале, с помощью какого-то пула распределения, который позволяет вам повторно использовать их, а не непосредственно в куче. –