2010-05-14 189 views
3

我需要輪詢運行某些專有軟件的服務器以確定此服務是否正在運行。使用wireshark,我已經能夠縮小它使用的TCP端口,但看起來流量是加密的。確定服務器是否在給定端口上偵聽

在我的情況下,如果服務器正在接受連接(即telnet serverName 1234),那麼服務啓動並且一切正常。換句話說,我不需要做任何實際的數據交換,只需打開一個連接然後安全地關閉它。

我想知道如何用C#和套接字來模擬這個。我的網絡編程基本上以WebClient結束,所以這裏的任何幫助都非常感謝。

回答

6

該過程其實很簡單。

using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) 
{ 
    try 
    { 
     socket.Connect(host, port); 
    } 
    catch (SocketException ex) 
    { 
     if (ex.SocketErrorCode == SocketError.ConnectionRefused) 
     { 
      // ... 
     } 
    } 
} 
+0

有沒有辦法調整連接超時?它似乎失敗了,但只有大約一分鐘後... – Nate 2010-05-14 18:51:06

+0

@Nate我相信這是多久的過程。沒有連接超時選項。 – ChaosPandion 2010-05-14 18:57:23

+0

我加了'if(ex.SocketErrorCode == SocketError.ConnectionRefused || ex.SocketErrorCode == SocketError.TimedOut)' – Nate 2010-05-14 19:00:26

0

使用TcpClient類連接服務器。

3

只要使用TcpClient嘗試連接到服務器,如果連接失敗,TcpClient.Connect將引發異常。

bool IsListening(string server, int port) 
{ 
    using(TcpClient client = new TcpClient()) 
    { 
     try 
     { 
      client.Connect(server, port); 
     } 
     catch(SocketException) 
     { 
      return false; 
     } 
     client.Close(); 
     return true; 
    } 
} 
+0

有沒有辦法調整連接超時?它似乎失敗了,但只有大約一分鐘後...... – Nate 2010-05-14 18:51:36

2

我已經使用了下面的代碼。有一個警告......在高事務環境中,客戶端的可用端口可能會耗盡,因爲這些套接字不是由操作系統以.NET代碼發佈的相同速率釋放的。

如果有人有更好的主意,請發帖。我發現服務器無法再傳出連接時會出現雪球問題。我正在尋找更好的解決方案...

public static bool IsServerUp(string server, int port, int timeout) 
    { 
     bool isUp; 

     try 
     { 
      using (TcpClient tcp = new TcpClient()) 
      { 
       IAsyncResult ar = tcp.BeginConnect(server, port, null, null); 
       WaitHandle wh = ar.AsyncWaitHandle; 

       try 
       { 
        if (!wh.WaitOne(TimeSpan.FromMilliseconds(timeout), false)) 
        { 
         tcp.EndConnect(ar); 
         tcp.Close(); 
         throw new SocketException(); 
        } 

        isUp = true; 
        tcp.EndConnect(ar); 
       } 
       finally 
       { 
        wh.Close(); 
       } 
      } 
     } 
     catch (SocketException e) 
     { 
      LOGGER.Warn(string.Format("TCP connection to server {0} failed.", server), e); 
      isUp = false; 
     } 

     return isUp; 
相關問題