2010-06-07 96 views
4

我有一個通過tcpListener進行通信的服務。 問題在於用戶何時重新啓動服務 - 引發了「地址已在使用中」異常,並且服務無法在幾分鐘左右啓動。如何強行關閉TcpListener

有什麼辦法告訴系統終止舊的連接,所以我可以打開一個新的? (我不能只使用隨機端口,因爲服務沒有辦法通知客戶端端口是什麼,所以我們必須依賴預定義端口)

回答

3

在綁定到監聽端口之前設置SO_REUSEADDR套接字選項。它看起來像相應的.NET代碼是這樣的:

SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1); 
+0

謝謝。效果很好 – Nissim 2010-06-07 20:44:04

1

有一個原因是關閉後一段時間不使用套接字。 一個Socket由4個元組組成,Source和Dest Port,Source和Dest IP。

比方說,當客戶端忙於向服務器發送數據時,強行關閉套接字。 您等待5秒鐘,然後使用相同的端口重新打開服務器,並且同一個客戶端將數據發送到同一個4元組,服務器將獲得具有錯誤tcp序列號的數據包,並且連接將重置。

你是搬起石頭砸自己的腳:)

這就是爲什麼連接有2-4分鐘(視發行版),直到他們可以再次使用TIME_WAIT狀態。 只是要清楚,我在談論SOCKET,而不僅僅是偵聽的TCP端口。