2012-01-26 5 views
6

Я пытаюсь асинхронно сканировать TCP-порты. Поскольку открытые порты занимают всего несколько сотых миллисекунды, чтобы завершить их, все нормально, но когда порты закрыты, я должен ждать ответа.Как ускорить процесс сканирования портов TCP?

Итак, что происходит, я запускаю приложение и почти сразу вижу, что порт 80 открыт. Тогда я должен подождать полминуты, чтобы все остальные порты были отсканированы.

EDIT. плюс я хотел бы показать реакцию, как это происходит, и ждать проверки других портов.

Как это сделать быстрее?

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», а закрытые порты ждут, пока не будет достигнут график – Matten

+0

@Matten. Я также не понимаю, почему закрытые порты отображаются почти одновременно. – NewHelpNeeder

+3

@NewHelpNeeder: Они не «закрываются». Они фактически скрыты брандмауэром, поэтому вы не получите сообщение ICMP для «Port Unreachable», которое сообщит вашему программному обеспечению, что порт закрыт. Таким образом, единственным признаком, который вы получаете, является тайм-аут без ответа. Поскольку тайм-аут одинаковый для всех подключений, и вы сразу же запускали все подключения, тайм-ауты все одновременно возникают. –

ответ

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

Смежные вопросы