2015-03-05 1 views
0

Я не уверен, как инициализировать 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?

+0

Код, который вы показываете, сломан. Буфер данных и «OVERLAPPED» должны быть действительными до тех пор, пока наложенная отправка не завершится, а завершение будет извлечено из IOCP. ТОЛЬКО WSABUF может быть основан на стеке и существовать исключительно на время вызова API WSASend(). –

+0

@Len Holgate Итак, 'buck' и' wsaOverlapped' должны быть созданы в куче? –

+0

Да. В идеале, с помощью какого-то пула распределения, который позволяет вам повторно использовать их, а не непосредственно в куче. –

ответ

0
memset(&wsaOverlapped, 0, sizeof(wsaOverlapped)); 

Или явно установить все значения к нулю.

0

WSAOVERLAPPED структура подлежит the same rules as the OVERLAPPED structure, т.е.

Любые неиспользуемые члены этой структуры должны всегда быть инициализирован в ноль перед структура используется в вызове функции. В противном случае функция может выйти из строя и вернуть ERROR_INVALID_PARAMETER.

+0

Но должен ли я инициализировать любой член 'WSAOVERLAPPED' или' OVERLAPPED' перед тем, как передать их в 'WSASend()' или 'WSARecv()'? –

+0

Конечно. Если вы используете их, вы должны инициализировать их до соответствующего значения, например, установив hEvent в действительный дескриптор события; если вы их не используете, вы должны инициализировать их до нуля. –

+0

Если я не хочу использовать события и хочу только получать уведомления через пакеты завершения, должен ли я устанавливать 'WSAOVERLAPPED.hEvent' значение' NULL', или это нормально, чтобы не инициализировать его вообще? Кроме того, как насчет других участников, они используются мной или системой? –