2012-06-23 91 views
3

我正在開發一個使用c#的Windows服務中使用tcp監聽器的tcp服務器應用程序。如何知道tcp服務器是否處於監聽狀態

開始我的服務後,它工作正常,並接受新的客戶端。經過一段時間,當新客戶端嘗試連接到服務器時,它會給出以下例外:

連接失敗,服務器是否正在運行?因爲目標機器主動拒絕它,所以不能連接 。

此時服務僅處於運行狀態。

如何驗證tcp服務器是否處於偵聽狀態?

+0

你能粘貼代碼嗎? – AurA

回答

0

不知道你的意思編程或沒有,但對於後者,你可以嘗試遠程登錄:Telnet主機端口

telnet yahoo.com 80 
telnet localhost 3306 

+0

這將有同樣的問題,應用程序正在。它無法區分'不聽'和'積壓隊列滿',這將導致Windows服務器拒絕連接。 – EJP

1

的netstat -ab

此命令將爲您提供有關所有活動連接與程序名稱的信息。

另一種選擇是從標記Russinovich TcpView

0

如果要檢查服務器是否正在監聽,而服務器是Windows,你可以簡單地使用(例如8888是你的監聽端口)

netstat -ano|findstr "8888" 

然後你會看到你的服務器實例的PID。另外,如果你想檢查TCP連接嘗試失敗的原因,你可以使用Wireshark來捕獲服務器端的所有TCP數據包,然後原因很明顯。

E.g.如果服務器已達到開放套接字號的限制,則會看到客戶端與服務器之間的SIN,以及服務器如何響應。

+0

所有連接拒絕在線上看起來都是一樣的:一個FIN段。你無法通過線路上的東西辨別原因。 – EJP

1

如果您的服務器仍在運行並且尚未關閉偵聽套接字,它仍處於偵聽狀態。但是,如果平臺是Windows並且服務器的積壓隊列已滿,則Windows將拒絕進一步的連接。這意味着你的服務器很慢接受新的連接。

+0

+1。如果服務器沒有崩潰 - 這可能是原因。 –

+0

@Sergey我不知道有任何其他*可能的原因... – EJP

相關問題