2012-01-26 30 views
6

Tôi đang cố gắng quét không đồng bộ các cổng TCP. Vì các cổng mở chỉ mất vài trăm phần nghìn giây để hoàn thành chúng tốt, nhưng khi các cổng được đóng, tôi phải chờ phản hồi.Làm thế nào để làm cho quá trình quét cổng TCP nhanh hơn?

Vì vậy, điều xảy ra là tôi chạy ứng dụng và gần như ngay lập tức, tôi thấy cổng 80 sẽ mở. Sau đó, tôi phải chờ đợi như một nửa phút cho tất cả các cổng khác để có được quét.

EDIT. cộng với tôi muốn hiển thị các phản ứng như nó xảy ra, với ra chờ đợi cho các cảng khác để được kiểm tra.

Cách thực hiện điều này nhanh hơn?

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

chúng gần như được mở đồng thời, nhưng cho đến khi hết thời gian chờ, các cổng không hoạt động sẽ chặn. do đó một cổng mở ngay lập tức trả về "open2" và các cổng đóng đợi cho đến khi hết thời gian chờ – Matten

+0

@Matten, tôi cũng không hiểu tại sao các cổng đóng được hiển thị gần như cùng một lúc. – NewHelpNeeder

+3

@NewHelpNeeder: Chúng không bị "đóng cửa". Chúng thực sự bị tàng trữ bởi tường lửa, vì vậy bạn không nhận được thông báo ICMP cho "Port Unreachable" có thể thông báo cho phần mềm của bạn rằng cổng đã bị đóng. Vì vậy, chỉ có duy nhất bạn nhận được là một thời gian chờ mà không có phản ứng. Vì thời gian chờ là như nhau đối với tất cả các kết nối và bạn đã bắt đầu tất cả các kết nối cùng một lúc, tất cả thời gian chờ đều xuất hiện cùng một lúc. –

Trả lời

7

Bạn có thể sử dụng WaitHandle BeginConnect trở về chỉ chờ quá lâu.

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

Hoạt động cho tôi +1 – Muthukkumaran

+0

Làm việc cho tôi quá :-) – jreichert

Các vấn đề liên quan