2011-03-29 116 views
0

我在寫一個使用I/O完成端口的小型服務器客戶端。GetQueuedCompletionStatus在遠程套接字關閉時返回ERROR_NETNAME_DELETED

我通過AcceptEx在我的完成端口上成功連接服務器和客戶端。 客戶端連接後,客戶端套接字與完成端口關聯,並且調用該套接字上的WSARecv的重疊調用。

一切正常,直到我關閉客戶端測試程序。 GetQueuedCompletionStatus()回報FALSEGetLastError回報

ERROR_NETNAME_DELETED

,這是有道理的,我(後來看了MSDN上的描述)。

但我的問題是,我認爲呼叫GetQueuedCompletionStatus會返回一個數據包,指示由於套接字關閉而導致的故障,因爲WSARecv會返回適當的返回值。 由於這不是這種情況,我不知道哪些客戶端的套接字造成的錯誤,並不能以我需要的方式行事(釋放結構,清除這個特定的連接等)...

任何關於如何解決這個問題,還是提示?

謝謝:)

編輯:http://codepad.org/WeYINasO < - 負責代碼...「錯誤」在開始的while循環(通話到GetCompletionStatus()第一功能是隻對GetQueuedCompletionStatus時的包裝occures(在其他情況下)工作正常)沒有將它張貼在那裏,因爲它看起來低劣&凌亂在這裏]

+0

您能告訴我們一些代碼嗎? – 2011-03-29 15:49:49

+0

你需要哪部分?如果(GetQueuedCompletionStatus()== FALSE)或GetLastError-Part? hahahaha;)... 那麼...說實話...哪個部分? ......從我的角度來看,沒有任何意義,因爲它是一個固有的東西,據我所見 – Incubbus 2011-03-29 15:55:42

+0

你在那裏做出了一個很大的假設。你需要幫忙嗎? – 2011-03-29 16:08:36

回答

4

下面是你需要注意調用GetQueuedCompletionStatus時的情景:

  • GetQueuedCompletionStatus返回TRUE已收到一個成功的完成數據包,所有輸出參數都已填充。
  • GetQueuedCompletionStatus返回FALSElpOverlapped == NULL沒有數據包出列。其他輸出參數包含不確定的值。
  • GetQueuedCompletionStatus返回FALSE,lpOverlapped != NULL該函數已經使失敗的完成數據包出隊。錯誤代碼可通過GetLastError獲得。

要回答你的問題,當GetQueuedCompletionStatus回報FALSElpOverlapped != NULL,有一個失敗的I/O完成。這是您需要關注的lpOverlapped的價值。

+0

我遇到最後一個選項。 我想我應該通過擴展的重疊結構讀出插座並關閉它。 謝謝:) – Incubbus 2011-03-29 20:48:50

1

我知道這是一個古老的問題,但我發現這個頁面雖然沒有結果地搜索到關於ERROR_NETNAME_DELETED的詳細信息。這是我在做重疊Readfile()時得到的錯誤。

經過一些調試後,發現問題是由於程序寫入套接字,但在使用ExitProcess()(由於垃圾收集問題)之前忘記調用closesocket()引起的。調用CloseHandle()沒有阻止錯誤,也不ExitProcess()之前沒有加入WSACleanup()。但是,在客戶端退出之前添加短暫睡眠可以防止出現錯誤。也許避免ExitProcess()也會阻止這個問題。

所以我懷疑你的問題是由於沒有正確的逼搶插座退出程序引起的。

我不認爲這將是對Unix的一個問題,即插座只是普通的文件描述符。