2011-06-16 76 views
1

我在Windows 2003服務器上運行了一個非常大的應用程序。它創建了將近900個線程和一個使用套接字進行操作的線程。這是一個我用Visual Studio環境編譯的C++應用程序。Windows 2003服務器套接字錯誤10055

經過將近17-20小時的測試後,發送數據時發生10055套接字錯誤。 除了這個錯誤,我的應用程序運行良好,沒有任何錯誤或問題。這是一款具有4 GiB RAM的四核系統,該應用程序在其所有運行中佔用大約30-40%的CPU(在所有4個CPU上)。

任何人都可以幫助我通過這個。我在谷歌搜索了幾乎所有關於這個錯誤的東西,但是沒有得到任何與我的案例相關的東西。

回答

0

我已經在IOCP插座系統前看到此症狀。我必須限制傳出的異步套接字發送,以便不會有太多數據在內核中排隊等待在套接字上發送。

雖然錯誤文字說這是由於連接數量而發生的,但這不是我的經驗。如果您編寫一個緊密循環,在單個套接字上執行異步發送,而不進行任何限制,則可以非常快速地實現這一點。

可能@Len Holgate在這裏增加了一些東西,他是我的Windows套接字問題的「goto人」。

+0

嗨@Steve Townsend,我無法正確解釋您的解決方案。即使我知道我的問題是因爲沒有。的連接(因爲我在應用程序的整個生命週期中只使用連接),儘管我創建了許多不。的線程,這是爲了一些其他的考慮。所以它肯定肯定是一些問題,你正在懷疑內存緩衝區被填滿了。你可以給我更多的指針,我可以開始尋找這個。 – pjain 2011-08-30 08:03:38

+0

@倫霍爾蓋特你能幫我解決嗎?我仍然無法解決這個問題。我也嘗試過使用TCP_NO_DELAY來使它儘快發送數據,但仍然存在這個問題。 – pjain 2011-11-02 12:59:51

0
It creates almost 900 threads 

這是部分您的問題。每個線程都可能使用默認的1MB堆棧。你開始接近GB的線程開銷。內存不足的可能性很高。使用IOCP的重點在於,您不必爲每個連接創建一個「線程」。您可以創建多個線程(從CPU的數量的1倍到4倍)來偵聽完成端口處理程序,並讓每個線程服務於不同的請求以最大化可伸縮性。

我記得讀過一篇關於Stack Overflow的文章,該文章將緩衝您發佈的掛起IOCP操作的設置,使得操作系統不會讓內存從物理內存換出到磁盤。然後,當連接數量變高時,您可能會耗盡系統資源。

如果我正確記得,解決方法是爲每個套接字連接發佈一個0字節的緩衝區(或者它是一個1字節的緩衝區)。當數據到達時,您的完成端口處理程序將返回,這是提示您的代碼發佈更大的緩衝區。如果我能找到鏈接,我會分享它。

相關問題