2012-01-26 33 views
6

我在尝试异步扫描TCP端口。由于开放端口只需几百毫秒就可以完成,但是当端口关闭时,我必须等待响应。如何使扫描TCP端口的过程更快?

所以会发生的是,我运行的应用程序,几乎马上我看到端口80打开。然后我必须等半分钟才能扫描所有其他端口。

编辑。再加上我想显示响应,因为它发生,等待其他端口进行检查。

如何让这更快?

private void btnStart_Click(object sender, EventArgs e) 
{ 
    for (int port = 79; port < 90; port++) 
    { 
     ScanPort(port); 
    } 
} 

private void ScanPort(int port) 
{ 
    TcpClient client = new TcpClient(); 
    client.BeginConnect(IPAddress.Parse("74.125.226.84"), port, new AsyncCallback(CallBack), client); 
} 

private void CallBack(IAsyncResult result) 
{ 
    bool connected = false; 

    using (TcpClient client = (TcpClient)result.AsyncState) 
    { 
     try 
     { 
      client.EndConnect(result); 
      connected = client.Connected; 
     } 
     catch (SocketException) 
     { 
     } 
    } 

    if (connected) 
    { 
     this.Invoke((MethodInvoker)delegate 
     { 
      txtDisplay.Text += "open2" + Environment.NewLine; 
     }); 
    } 
    else 
    { 
     this.Invoke((MethodInvoker)delegate 
     { 
      txtDisplay.Text += "closed2" + Environment.NewLine; 
     }); 
    } 
} 
+0

它们几乎同时打开,但是直到达到超时时间,未激活的端口才会被阻止。因此一个开放的端口立即返回“open2”,关闭的端口等到达到timout – Matten

+0

@Matten,我也不明白为什么几乎同时显示封闭的端口。 – NewHelpNeeder

+3

@NewHelpNeeder:他们不是“被关闭”。它们实际上是由防火墙屏蔽的,所以你不会得到“Port Unreachable”的ICMP消息,它会告诉你的软件端口已关闭。所以你得到的唯一迹象是没有回应的超时。由于所有连接的超时时间都是相同的,并且您一次启动所有连接,所以超时全部同时发生。 –

回答

7

您可以使用WaitHandle BeginConnect返回值来等待这么久。

using (var tcp = new TcpClient()) 
{ 
    var ar = tcp.BeginConnect(host, port, null, null); 
    using (ar.AsyncWaitHandle) 
    { 
     //Wait 2 seconds for connection. 
     if (ar.AsyncWaitHandle.WaitOne(2000, false)) 
     { 
      try 
      { 
       tcp.EndConnect(ar); 
       //Connect was successful. 
      } 
      catch 
      { 
       //EndConnect threw an exception. 
       //Most likely means the server refused the connection. 
      } 
     } 
     else 
     { 
      //Connection timed out. 
     } 
    } 
} 
+0

适用于我+1 – Muthukkumaran

+0

适用于我:-) – jreichert