要清楚,我所指的所有TCPClients不是我自己的類的實例,它們都是System.Net.Sockets.TcpClient來自Mono的.NET 4.0實現。關閉System.Net.Sockets.TcpClient殺死同一IP地址的其他TCPClient的連接
我有一臺服務器正在偵聽客戶端連接,就像服務器一樣。每當它得到一個新的客戶端,它就創建一個新的TCPClient來處理新線程上的連接。我正在用字典跟蹤所有連接和線程。如果客戶端斷開連接,它將向服務器發送斷開連接消息,TCPClient關閉,字典條目被刪除,線程自然死亡。沒有大驚小怪,沒有麻煩。服務器可以毫無問題地處理多個客戶端。
但是,我模擬如果客戶端斷開連接,沒有機會發送斷開連接消息,然後重新連接會發生什麼。我正在檢測客戶端是否與用戶名系統重新連接(當我完成測試時它會更安全)。如果我只是創建一個新的TCPClient並讓舊的TCPClient運行,那麼系統工作的很好,但是我有一堆無用的線程,它們佔用了空間並且什麼也不做。懶蟲。
所以我嘗試關閉與舊連接關聯的TCPClient。當我這樣做,新的TcpClient也死了,客戶端程序將引發此錯誤:
E/mono (12944): Unhandled Exception: System.IO.IOException: Write failure ---> System.Net.Sockets.SocketException: The socket has been shut down
而且服務器拋出這個錯誤:
Unable to write data to the transport connection: An established connection was aborted by the software in your host machine.
Cannot read from a closed TextReader.
因此收舊的TcpClient與遠程端點發言權:192.168.1.10:50001
而且打破了發言權的遠程端點新的TcpClient:192.168.1.10:50002
於是兩人的TcpClient對象具有相同的遠程端點IP地址,但具有不同的遠程端點端口。但關閉這個似乎阻止了另一個工作。我希望能夠關閉舊的TCPClient進行清理,而不關閉新的TCPClient。
我懷疑這與TCPClient如何在低級別的套接字下工作有關,但沒有任何真正的理解,我無法解決它。
字典的關鍵是什麼?如果是用戶名,這似乎來自關閉錯誤的TCPClient – 2012-02-08 01:39:54
好的想法,但我沒有添加新的連接到字典,直到衝突解決。我使用字典關閉舊連接,刪除字典條目,然後將新連接添加到字典。 – Excrubulent 2012-02-08 01:42:42
另外,字典的關鍵確實是用戶名。 – Excrubulent 2012-02-08 01:46:12