Это дополнительный вопрос к этому вопросу. На следующем уровне я теперь хочу использовать максимальный параллелизм задач для подключения к ожидаемым хостам на большом наборе IP-адресов, используя TCP / IP на конкретном порту.
Мои собственные исследования, а также рекомендации сообщества привели меня к ключевым статьям, например:
Это позволило мне настроить свой собственный код, который работает нормально, но в настоящее время занимает полные 30 секунд, чтобы завершить сканирование 255 IP-адресов, используя только один конкретный порт. Учитывая тест, машина имеет 8 логических ядер, это наблюдение показывает, что моя конструкция действительно порождает максимум 8 одновременных задач (255/8 = 31,85).
Функция, которую я написал, возвращает список отвечающих IP-адресов {IPs}, который является подмножеством списка всех IP-адресов {IP_Ports}, которые необходимо проверить. Это мой текущий код, который работает нормально, но еще не подходит для использования в больших сетях из-за того, что я подозреваю, из-за отсутствия эффективного параллелизма задач:
// Check remote host connectivity
public static class CheckRemoteHost
{
// Private Class members
private static bool AllDone = false;
private static object lockObj = new object();
private static List<string> IPs;
// Wrapper: manage async method <TCP_check>
public static List<string> TCP(Dictionary<string, int> IP_Ports, int TimeoutInMS = 100)
{
// Locals
IPs = new List<string>();
// Perform remote host check
AllDone = false;
TCP_check(IP_Ports, TimeoutInMS);
while (!AllDone) { Thread.Sleep(50); }
// Finish
return IPs;
}
private static async void TCP_check(Dictionary<string, int> IP_Ports, int timeout)
{// async worker method: check remote host via TCP-IP
// Build task-set for parallel IP queries
var tasks = IP_Ports.Select(host => TCP_IPAndUpdateAsync(host.Key, host.Value, timeout));
// Start execution queue
await Task.WhenAll(tasks).ContinueWith(t =>
{
AllDone = true;
});
}
private static async Task TCP_IPAndUpdateAsync(string ip, int port, int timeout)
{// method to call IP-check
// Run method asynchronously
await Task.Run(() =>
{
// Locals
TcpClient client;
IAsyncResult result;
bool success;
try
{
client = new TcpClient();
result = client.BeginConnect(ip, port, null, null);
success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromMilliseconds(timeout));
if (success)
{
lock (lockObj)
{
IPs.Add(ip);
}
}
}
catch (Exception e)
{
// do nothing
}
});
}
}// end public static class CheckRemoteHost
Итак, мой вопрос: как я могу максимизировать параллелизм задачи запроса ответа с использованием TCP / IP на порту X, чтобы я мог получить очень быстрое сканирование сети IP-порта в больших внутренних сетях?