發表文章

目前顯示的是 11月, 2016的文章

C# 設定TcpClient連線時的TimeOut

我在設計一個測試主機是否存活的連線方式,通常除了Ping的方式之外,另外一種就是模擬telnet的連線方式,當伺服器的ICMP被關閉時,或是防火牆未開啟ICMP的通道時,Ping Host 就無法成功,但是通常伺服器都會開啟定服務埠來提供外部的服務,例如 Http(80)、DNS(43)、FTP(21)、RDP(3389)、HTTPS(443)、other Http(8080)、1433(SQL)等等。 此時可以透過基本的 Socket Connection 來確定該服務可以連線,基本上若是不存可以連線的埠,則 Connect 會發生拒絕連線的 Exception,但是在透過防火牆後的連線,有可能連拒絕連線的訊息都不會回應,導致 Connection被 Hang住,故在設計 Scoket Connect 時要有 Timeout 的設計,最好可以自己決定 Timeout 時間,但是 Socket 或 TcpClient 都沒有 Connect 的 Timeout 可以去設定,因此我們使用了 BeginConnect 非同步連線 + ManualResetEvent 等待中斷的事件來處理。 using System.Net.NetworkInformation; using System.Net; using System.Net.Sockets; using System.IO; using System.Threading; namespace Test {     class tcptool     {         //可以取得的回覆訊息         public string ReplyMessage;               private static bool IsConnectionSuccessful = false;         private static Exception socketexception;         private static ManualResetEvent TimeoutEvent = new ManualResetEvent(false);         public bool connectHost(string sHost, int port ,