2010-07-16 55 views
0

我在我的代碼中遇到了一個錯誤,它在重疊套接字上使用WSARecv和WSAGetOverlapped結果。在負載很重的情況下,WSAGetOverlapped會返回WSASYSCALLFAILURE('系統調用永遠不會失敗'),並且我的TCP流在之後不同步,從而導致我的程序上層發生混亂。WSASYSCALLFAILURE與Windows XP上的重疊IO

到目前爲止,我還沒有能夠將它隔離到給定的一組硬件或驅動程序。有人也遇到了這個問題,並找到了解決方案或解決方法?

回答

0

看來我已經解決了這個問題,睡眠1ms,並在WSASetCALLFAILURE報告時重試WSAGetOverlapped結果。

我有另一個問題與重疊事件觸發有關,即使沒有數據,我也必須先解決。測試現在運行了一個多小時,幾個WSASYSCALLFAILURE正確處理。希望通宵測試也會成功。

@恩:再次感謝您的幫助。

編輯:通宵測試是成功的。

問題1:在ConnectionSet WaitForMultipleObjects的::選擇一個空的插槽偶爾 信號數據,SocketConnection處造成:: readSync到 僵局我的錯誤是由兩個相互依存的問題引起的。 修復:對每個數據包的第一個字節進行非阻塞式讀取。重置 連接集如果套接字爲空

問題2:WSAGetOverlappedResult偶爾返回WSASYSCALLFAILURE, 導致TCP流不同步。 修復:重試WSAGetOverlappedResult 小睡眠期。

http://equalizer.svn.sourceforge.net/viewvc/equalizer?view=revision&revision=4649

+0

嗯......我通常非常警惕需要睡眠的「修復」......我預計它更可能是您的代碼中存在競爭條件,並且在您轉移到目前還無法實現的硬件時,您的「修復」會在幾年後回來咬你) – 2010-08-03 14:45:34

+0

我同意您的意見,通常不會那樣做'修復'。然而,在這個例子中,我已經調試了死亡代碼,並且相當確信它不是我的代碼中的一個種族。錯誤代碼是WSASYSCALLFAILURE,它是一個Un-Error。此外,它只發生在不尋常的通信模式下(許多節點向一個節點發送大量數據),這可能是它仍然在WinSocks中的原因。 Winsock之前還有其他問題,例如:http://www.mombu.com/microsoft/alt-winsock-programming/t-wsasendto-resulting-in-stack-corruption-678924.html – eile 2010-08-03 16:52:32

+0

再次這看起來可能是一個競爭條件恕我直言...你怎麼知道什麼時候你的每I/O完成,我沒有看到任何引用計數繼續,恕我直言,你需要引用計數每個插座和每我/ o數據,以確保您在正確的時間清理,而不是在... – 2010-08-05 11:39:10

1

有多少個連接,有多少個待處理的recvs,有多少個outsanding發送? perfmon或task manager對非頁面緩衝池使用量有何評論?盒子裏有多少內存?如果您在Vista或更高版本上運行該程序,它會消失嗎?你有沒有安裝LSPs?

當分配內存失敗時,您可能會耗盡非分頁池並導致編寫不當的驅動程序時出現故障。由於非頁面緩衝池的數量急劇增加(有關詳細信息,請參閱http://www.lenholgate.com/blog/2009/03/excellent-article-on-non-paged-pool.html),此問題在Vista或更高版本上不太可能受到影響。或者,您可能會遇到「鎖定頁面」限制(您只能在操作系統的內存中鎖定固定數量的頁面,並且每個掛起的I/O操作會鎖定一個或多個頁面,具體取決於緩衝區大小和分配對齊方式)。

+0

約10個連接,每個連接有一個未決接收。發送實施阻止,以便至多有一個未完成的發送。我稍後會檢查其餘的。 因爲我們還沒有測試集羣,所以測試Vista需要一些時間。感謝所有的提示 - 一旦我追蹤下來,我會再次發佈。 – eile 2010-07-16 14:17:06

+0

那麼不太可能成爲資源限制。可能只是一個壞的司機?你可以嘗試使用不同網卡和驅動程序的機器嗎? – 2010-07-16 16:30:07

+0

我們在不同的機器和驅動程序上始終存在這個問題。 我開始認爲在XP上有一個重疊的IO錯誤。我們的應用程序有點不同,因爲一堆渲染從屬設備會將像素數據發送到一臺計算機,而不是將服務器應用程序發送給一羣客戶端。 – eile 2010-07-17 09:34:18