2010-06-11 3 views
1

Я пытаюсь запустить небольшое приложение, которое сканирует порты и проверяет, открыты ли они, используя и тренируясь с помощью потоков. Окно консоли запросит номер и сканирует порты от 1 до X и отобразит каждый порт, открыты ли они или закрыты. Моя проблема заключается в том, что, проходя через каждый порт, он иногда останавливается преждевременно. Это не останавливается ни на одном номере, ни на его довольно случайном. Например, я укажу 200. Консоль будет прокручивать каждый порт, а затем останавливается на 110. В следующий раз, когда я запустил его, он остановится на 80.Сканирование портов с помощью threadpool

Код Оставшись из некоторых вещей, предположим, что все переменные объявлены там, где они должен. Первая часть находится в Main.

static void Main(string[] args) 
    { 
     string portNum; 
     int convertedNum; 
     Console.WriteLine("Scanning ports 1-X"); 
     portNum = Console.ReadLine(); 
     convertedNum = Convert.ToInt32(portNum); 
     try 
     { 
      for (int i = 1; i <= convertedNum; i++) 
      { 
       ThreadPool.QueueUserWorkItem(scanPort, i); 
       Thread.Sleep(100); 

      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("exception " + e); 
     } 
    } 

    static void scanPort(object o) 
    { 
     TcpClient scanner = new TcpClient(); 
     try 
     { 
      scanner.Connect("127.0.0.1",(int)o); 
      Console.WriteLine("Port {0} open", o); 
     } 
     catch 
     { 
      Console.WriteLine("Port {0} closed",o); 
     } 
    } 

} 
+3

показать нам код – unbeli

+0

I второй @unbeli. –

+0

@thenry Редактировать сообщение с кодом из вашего комментария .... Если у вас проблемы с форматированием ... спросите хорошо, и я уверен, что кто-то его очистит. – Rusty

ответ

3

Если это весь код, то ошибка, вероятно, вызвана просто проваливаться до конца main(), не дожидаясь всех нитка пула потоков до конца. Потоки ThreadPool отменены, как только ваш основной поток выходит после падения через main(). Попробуйте удалить Thread.Sleep(100) (это не обязательно, это неправильный путь, вы никогда не узнаете, как долго спать, и это частично поражает цель использования ThreadPool), и вы, вероятно, даже не проверите один порт!

Вместо этого вы можете настроить каждый из ваших рабочих потоков и использовать WaitAll в главном для всех событий. См. Пример http://msdn.microsoft.com/en-us/library/3dasc8as.aspx.

Edit: Думая это через, решение ссылается на ссылку выше, вероятно, меньше, чем идеально подходит для вас, а также (это может включать в себя необходимости выделить массив 65000 событий, это было бы чрезмерным). В .net 4 вы можете использовать CountdownEvent вот так:

Прошу прощения, но проверьте этот пример http://msdn.microsoft.com/en-us/library/system.threading.countdownevent.aspx и сообщите нам, когда у вас появятся дополнительные вопросы. Я уверен, что кто-то может и будет разрабатывать или предлагать более качественные решение и решение, более подходящее для .net3

+0

Мне кажется, что Бен ударил ноготь по голове. Если вы делаете это, чтобы узнать больше о потоковой передаче, вы можете рассмотреть возможность явной установки максимальных потоков в пуле с помощью SetMaxThreads(). MSDN говорит, что по умолчанию в пуле установлено 250 потоков. Для некоторых типов операций вы можете получить более высокую производительность с большим или меньшим количеством одновременных потоков. –

0

Что такое ОС? Не забывайте, что разные версии XP имеют ограничения на подключение tcp, в то время как вы также можете запускать защиту от DDOS.

Кроме того, ваша логика ошибочна. Просто потому, что TcpClient.Connect исключено, не означает, что порт закрыт. Вы должны захватывать и отображать данные этого исключения, поскольку я предполагаю, что он предложит вам более глубокое понимание того, почему ваш код останавливается. Имейте в виду, его можно также выкинуть SocketException или SecurityException.

0

Что касается резьбовой части, вы можете рассмотреть возможность использования параллельной библиотеки задач (TPL) вместо прямого доступа к ThreadPool. IMHO предлагает более простое использование и более интуитивно понятный/читаемый синтаксис.