2010-03-29 62 views
5

我正在寫一個自定義的TCP服務器和客戶端,並做了大量的請求(準確的60,000)我開始得到這個10048的套接字錯誤,其中should mean「該地址已被使用。」客戶端上的套接字錯誤10048?可能的原因?

錯誤不斷髮生,除非我暫停過程像2或3分鐘,然後重新開始,然後在重新啓動它後不久就會出現相同的錯誤。如果我暫停客戶端進程並重新啓動服務器進程,我仍然會在客戶端上看到相同的錯誤。所以這是一個完整的客戶端問題。

雖然這並沒有任何意義,但這種錯誤通常只發生在綁定時,並且此錯誤發生在客戶端而不是服務器上。可能的原因是什麼?

我初始化的小摘錄:

TcpClient client = new TcpClient(); 
client.Connect("XXXXX -- some ip", 25000); 
client.NoDelay = true; 
NetworkStream clientStream = client.GetStream(); 

而且,一切似乎是工作的罰款(包括它發送來回時間量),這完美的作品使用127.0.0.1時,但是當把它放在另一臺LAN計算機上,我開始得到10048錯誤。

初始化它有什麼問題嗎?還有什麼可能導致客戶端的這個錯誤?

回答

9

請參閱http://msdn.microsoft.com/en-us/library/e160993d%28v=VS.90%29.aspx SetSocketOption。你需要DontLinger或者ReuseAddr,或者兩者都有,我不確定。基本上,在拆除TCP連接後,您的套接字會一直處於TIME_WAIT狀態一段時間,一旦您獲得足夠的套接字,您將無法創建任何新的客戶端連接。用netstat -na程序輸出驗證。

您還可以通過在 註冊表更改它減少插座停留在TIME_WAIT狀態的時間: http://msdn.microsoft.com/en-us/library/aa560610%28BTS.20%29.aspx 默認爲4分鐘,這大概可以降低到1或2分鐘安全,特別是用於測試。

聲明:我不是任何方式的TCP大師。

+0

我接着說:client.LingerState =新LingerOption(假,0);'和用netstat,你的權利,我有TIME_WAIT連接的廢話負荷 – Earlz 2010-03-29 20:46:27

+0

我的意思是,在添加'LingerState'後,我仍然有很多TIME_WAIT位 – Earlz 2010-03-29 20:48:12

+0

ReuseAddr也沒有幫助。 – Earlz 2010-03-29 21:37:27

0
+0

如果這是原因,那麼當我使用本地主機時它如何正常工作? – Earlz 2010-03-29 21:37:56

+1

@Earlz:可能是因爲127.0.0.1上的連接使用非常低(0?)的最大段壽命,因爲我們實際上無法獲得漫遊數據包。我無法通過Google搜索找到任何內容,但它是有道理的。你可以嘗試使用一個接口IP,看看它是否能夠在本地機器上重現 - 儘管這也可能被優化。也可以在服務器上查看將TcpTimedWaitDelay設置爲30秒(http://msdn.microsoft.com/zh-cn/library/ms819739.aspx),如果可以的話 – 2010-03-29 22:42:37

相關問題