none
如何ping 看看遠端 IP 的某個其他的 port有沒有被聆聽 RRS feed

  • 問題

  • 請問各位高手

     

    如何ping 看看遠端 IP 的某個其他的 port有沒有被聆聽

     

    使用  My.Computer.Network.Ping("127.0.0.1")  無法知道某的Port的Service是否有開啟

     

     

     

    2008年3月6日 上午 08:36

解答

  • 參考: Creating a Port Scanner with C#

    private
    class PortScan //scans ports to see if they accept a connect
    {
        public static bool Connect(string IPAddress, int Port, int WaitSeconds)
        {
            TcpClient TcpScan = new TcpClient();
     
            try
            {
                // Try to connect
                bool ConnectSuccess = false;
                TcpScan.BeginConnect(IPAddress, Port, null, null);
                for (int i = 0; i <= WaitSeconds; i++) //wait specified # seconds for connection
                {
                    Thread.Sleep(1000); //wait 1 sec
                    if (TcpScan.Connected)
                    {
                        ConnectSuccess = true;
                        break;
                    }
                }
                return ConnectSuccess;
                // If there's no exception, we can say the port is open
            }
            catch
            {
                return false; // An exception occured, thus the port is probably closed
            }
            finally
            {
                TcpScan.Close(); //close the connection and socket
            }
        }
    }
    2008年3月7日 下午 03:37

所有回覆

  • 看是 TCP 就用 TcpClient ,UDP 就用 UDP Client 去 Connect 看看。

    2008年3月6日 上午 11:35
    版主
  • 方便的話 可以貼個程式碼 供參考嗎?

     

    謝謝

    2008年3月7日 上午 01:17
  • 希望下次你是先看看線上手冊,試寫看看,這樣你才會進步。

     

     Public Function ConnectServer(ByVal strServer As String, ByVal nPort As Integer) As Boolean
      Dim tcpServer As New System.Net.Sockets.TcpClient
      Dim bConnect As Boolean = True

      With tcpServer
       .SendTimeout = 5000
       .ReceiveTimeout = 5000
       Try
        .Connect(strServer, nPort)
       Catch
        bConnect = False
       End Try

       Try
        .Close()
       Catch
       End Try
      End With

      Return bConnect
     End Function

     

     

    2008年3月7日 上午 02:34
    版主
  • 謝謝 解答

    我之前是一直搜尋 關於my.的用法 一直找不到方法

    看了大大的寫法之後,瞭解原來用 sockets  去連結指定的Port就可以了

     

        Public Function ConnectServer(ByVal strServer As String, ByVal nPort As Integer) As Boolean
            Dim tcpServer As New System.Net.Sockets.TcpClient
            Dim bConnect As Boolean = True

            With tcpServer
                .SendTimeout = 5000
                .ReceiveTimeout = 5000
                Try
                    .Connect(strServer, nPort)
                Catch
                    bConnect = False
                End Try

                Try
                    .Close()
                Catch
                End Try

            End With

           Return bConnect 
        End Function

     

     這樣對方的port一但沒有開啟 程式就卡住了耶....

     

    2008年3月7日 上午 04:40
  • 上面逾時是 5000 毫秒,所以只會卡 5 秒,嫌 5 秒太久的話,請自行縮短。

    2008年3月7日 上午 07:40
    版主
  • 我原本也以為應該只會卡5秒

    我改成 1000

                .SendTimeout = 1000
                .ReceiveTimeout = 1000

    但實際上run起來 程式會一直停在那邊 足足將近有一分鐘之久耶...

     

    請問我該再注意哪些地方呢?

    1000 不是等於一秒嗎?

     

     謝謝前輩不吝指導 ^^

     

    2008年3月7日 上午 09:19
  • 我測了一下,不管多少值,都需要 21 秒左右,那可能是我先前記錯了。

     

    更快的 Port 掃描可能要到各大範例網站找,我自己沒有專精這部分。

    2008年3月7日 上午 10:00
    版主
  • 用Thread的方式試看看吧,如果沒有其它方法的話.

     

     

    Code Snippet

    private void button3_Click(object sender, EventArgs e)
    {
       try
       {
          System.Threading.Thread t=new System.Threading.Thread(new System.Threading.ThreadStart(CheckPort));
          t.Start();
          t.Join(3000);
          if (t.IsAlive)
          {
             t.Abort();
             MessageBox.Show("Closed");
          }
          else
          {
             MessageBox.Show("Open");
          }
       }
       catch (Exception ex)
       {
          MessageBox.Show(ex.Message);
       }
    }

    private void CheckPort()
    {
       try
       {
          System.Net.Sockets.TcpClient tc = new System.Net.Sockets.TcpClient();
          tc.Connect("192.168.0.1", 80);

          if (tc.Connected)
          {
             tc.Close();
          }
       }
       catch
       { }
    }

     

     

    2008年3月7日 下午 02:59
  • 參考: Creating a Port Scanner with C#

    private
    class PortScan //scans ports to see if they accept a connect
    {
        public static bool Connect(string IPAddress, int Port, int WaitSeconds)
        {
            TcpClient TcpScan = new TcpClient();
     
            try
            {
                // Try to connect
                bool ConnectSuccess = false;
                TcpScan.BeginConnect(IPAddress, Port, null, null);
                for (int i = 0; i <= WaitSeconds; i++) //wait specified # seconds for connection
                {
                    Thread.Sleep(1000); //wait 1 sec
                    if (TcpScan.Connected)
                    {
                        ConnectSuccess = true;
                        break;
                    }
                }
                return ConnectSuccess;
                // If there's no exception, we can say the port is open
            }
            catch
            {
                return false; // An exception occured, thus the port is probably closed
            }
            finally
            {
                TcpScan.Close(); //close the connection and socket
            }
        }
    }
    2008年3月7日 下午 03:37
  • 感謝各位大大熱心提供資訊

    小弟將程式碼改為使用VB.NET如下

     

            Dim TcpScan As New System.Net.Sockets.TcpClient
            Dim ConnectSuccess As Boolean = False
            Dim WaitSeconds As Integer = 100

            TcpScan.BeginConnect("192.168.1.1", 1234, Nothing, Nothing)

            Dim i As Integer
            For i = 0 To WaitSeconds Step i + 1
                If (TcpScan.Connected) Then
                    ConnectSuccess = True

                End If
            Next
            MsgBox(ConnectSuccess)
            TcpScan.Close()

     

    目前初步測試 已經可以快速判斷出遠端某的Port是否有開啟

    由於對於這方面的使用控制上 還不是很熟,正處於入門自我摸索階段

    故在將程式碼貼上來請大大看看是否有哪些不妥可以加以改良

    例如: WaitSecounds 在這邊這樣寫,迴圈跑在多次好像也沒什麼用處

    TcpClient 本身是否有甚麼參數可以設定Time out 時間

    這樣的BeginConnect用法,對於連線品質不好時 是否可能誤判連線狀況?

    2008年3月10日 上午 07:54
  • 用迴圈跑會讓你的 CPU 處於滿載,此外不同電腦跑起來速度不同。

     

    等待可以用上面說的 Sleep ,或參考此連結得到更多的資訊。

    VB6/VBNET CPU 資源釋出

     

    由於你只是 1 秒內的掃描,所以直接用 Sleep 即可。

    2008年3月10日 上午 07:58
    版主
  • 在這行後面

            TcpScan.BeginConnect(strServer, nPort, Nothing, Nothing)

    '加上

            Dim millisecondsTimeout As Integer = 500

            Thread.Sleep(millisecondsTimeout)

     

    是這樣嗎?

    500 = 0.5秒?

    這樣程式會停止回應 0.5秒的意思嗎?

    那如果想讓sleep的時間加長

    而不想讓程式停頓繼續往下跑呢?

     

    因為我想做一個迴圈 定時不斷的偵測該Port是否開啟,但不要影響程式運作

     

     

    2008年3月10日 上午 09:19
  • 一般來說,只有在高速網路很順暢的情況下,才會 0.5 秒就有回應。

     

    所以通常逾時會設比較常,如果你確認你的電腦沒有 IPX 干擾,設 5 秒差不多。

     

    定時一般配合 Timer 控制項,比如說每 5 分鐘掃描一次。

     

    一般應用不會隨時掃,因為這會替網路造成無謂的封包,若是你是區網的話,不如在 Server 定時發送 udp 封包,則在 client 聆聽即可。

    2008年3月10日 下午 12:39
    版主