2010-06-26 49 views
1

爲了某些測試/分析目的,我使用IOCP製作了一個簡單的虛擬服務器/虛擬客戶端程序。 (並且我還想指出,我是新來的異步網絡編程)帶IOCP問題的ConnectEx

它看起來像服務器與原始客戶端運行良好,但是當虛擬客戶端嘗試使用ConnectEx函數連接到服務器時,IOCP工作線程仍然被GetQueuedCompletionStatus函數阻止,並且在服務器成功接受連接時從不返回結果。

問題和/或原因是什麼,我該如何解決這個問題?

+0

請顯示更多代碼。無論如何,當你嘗試遠程登錄你的服務器時它會做什麼? (telnet localhost ,作爲一個簡單的tcp客戶端非常有用)。 – 2010-06-26 11:40:10

+0

我很抱歉,我無法向您展示實際代碼,因爲它基於我們公司自己的庫,但客戶端的框架可以描述如下:WSAstartup - >創建IOCP - >啓動工作線程 - >使用IOCtl獲取ConnectEx - >綁定套接字 - >調用ConnectEx - >將插座分配給IOCP。我得到「套接字已連接」。當我嘗試重複連接到服務器時出現WSAGetLastError錯誤。我會嘗試telnet我的服務器tommorow。謝謝! – summerlight 2010-06-27 05:24:31

+0

當ConnectEx在新線程上僅用於連接目的被調用時,它似乎可以正常工作,但我仍然不知道這個問題的確切原因。 – summerlight 2010-06-29 08:13:23

回答

0

即使在將接受的套接字與IOCP相關聯後,工作線程仍會在GetQueuedCompletionStatus上阻塞,直到發佈「解鎖」完成事件。 接收/寫入操作的完成事件不會由系統發送,除非您「解鎖」您的新套接字。 有關詳細信息,請參閱Push Framework的源代碼http://www.pushframework.com這是一個使用IOCP的C++網絡應用程序框架。 「IOCPQueue」類中存在「解鎖」技巧。

+1

有趣的代碼...恕我直言,你正在創建IOCP不正確,因爲你創建的虛擬套接字創建IOCP不是爲重疊使用創建的,因爲你使用的是socket()而不是'WSASocket()' 'WSA_FLAG_OVERLAPPED'請參閱http://msdn.microsoft.com/en-us/library/aa363862(VS.85).aspx的文檔,其中涉及套接字的「爲重疊的I/O完成打開」要求。其次,如果你使用第一個套接字是爲了創建IOCP,那麼你可以簡單地傳遞NULL。第三,我從來沒有發現使用IOCP作爲文檔建議你應該使用「解鎖」是必需的。 – 2010-07-20 16:17:11

+0

關於上面Len的註釋,根據:http://msdn.microsoft.com/en-us/library/ms740506%28v=vs.85%29.aspx在備註部分:「創建的套接字將有重疊屬性作爲默認值「 – 2013-08-28 17:32:06

2

我想你用你的評論回答你自己的問題。

你的事件序列不正確,你說你綁定,ConnectEx,Associate to IOCP。

您應該綁定,將該套接字與IOCP關聯,然後再調用ConnectEx。