據MSDN:使用IOCP時,我應該將WSAOVERLAPPED的hEvent設置爲NULL還是設置爲WSAEVENT對象的有效句柄?
hEvent:如果I/O操作是沒有I/O 完成例程發出(操作的用lpCompletionRoutine參數是 設置爲null)的重疊,那麼這個參數要麼包含一個到WSAEVENT對象的有效句柄 或爲空。
由於我使用的是IOCP,當我打電話WSASend()或的WSARecv()我NULL傳遞給他們的最後一個參數(即用lpCompletionRoutine):
WSASend(pIoRequest->GetSocket(), pIoRequest->GetWsaBuffer(), 1, NULL, pIoRequest->GetFlags(), pIoRequest, NULL);
WSARecv(pIoRequest->GetSocket(), pIoRequest->GetWsaBuffer(), 1, NULL, &(pIoRequest->GetFlags()), pIoRequest, NULL);
我的「每I/O數據「類(pIoRequest)看起來像:
class IoRequest : public WSAOVERLAPPED
{
public:
IoRequest()
{
...
SecureZeroMemory(this, sizeof(WSAOVERLAPPED));
hEvent = WSACreateEvent(); // A
}
...
void ResetForNextIoRequest()
{
WSACloseEvent(hEvent); // B
SecureZeroMemory(this, sizeof(WSAOVERLAPPED));
hEvent = WSACreateEvent(); // C
...
}
...
DWORD& GetFlags() { return m_dwFlags; }
...
private:
...
DWORD m_dwFlags;
...
};
它似乎並沒有讓我的程序的行爲有什麼區別,即使我註釋掉標有A,上述B和C線。
那麼你如何決定何時調用WSACreateEvent()或簡單地設置hEvent爲NULL?
Ambroz-謝謝澄清。我可以再問一個問題嗎?在「IoRequest」中有「DWORD m_dwFlags」是否有意義(請參閱上面的編輯代碼)?我可以在我的工作線程中創建一個基於堆棧的DWRD dwFlags,並將它傳遞給WSASend()和WSARecv()? – jpen 2012-08-06 16:07:31
您似乎可以將它放在堆棧上,並在操作正在進行時讓它超出範圍。從WSARecv頁面:「在這種情況下,lpNumberOfBytesRecvd和lpFlags不會更新」。 WSASend沒有這個問題,因爲它只是取值而不是指針。 – 2012-08-06 16:12:27