Как ускорить процесс сканирования портов 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;
});
}
}
1 ответ
Решение
Вы можете использовать возврат 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.
}
}
}