2010-06-11 7 views
1

포트를 검사하고 스레드 풀을 사용하여 실습을하고 있는지 확인하기 위해 작은 앱을 실행하려고합니다. 콘솔 창은 번호를 묻고 1에서 X까지 포트를 스캔하고 열거 나 닫힌 포트를 표시합니다. 내 문제는 각 포트를 통과 할 때 때로는 조기에 중단된다는 것입니다. 하나의 숫자에서 멈추지도 않습니다. 꽤 무작위입니다. 예를 들어 200을 지정합니다. 콘솔이 각 포트를 스크롤하여 110에서 멈 춥니 다. 다음에 실행할 때 80에서 멈 춥니 다.포트 풀을 사용하여 포트 스캐닝

코드 모든 것을 제외하고 모든 변수가 선언 된 것으로 가정하십시오. 할까요. 첫 번째 부분은 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

두 번째 @unbeli. –

+0

@thenry 의견에서 코드를 사용하여 게시물을 수정하십시오. 서식을 지정하는 데 문제가있는 경우 ... 친절하게 물어 보면 누군가가 여러분을 위해 청소할 것이라고 확신합니다. – Rusty

답변

3

이 다음 오류가 아마 완료 모든 스레드 풀 스레드를 기다리지 않고 그냥 main()의 끝까지 하락에 의해 발생하는 전체 코드 인 경우. ThreadPool 스레드는 main()을 통과 한 후 주 스레드가 종료되면 모두 중단됩니다. Thread.Sleep(100)을 제거해보십시오 (필요하지 않습니다. 잘못된 길입니다. 잠자기 시간을 절대 알지 못하며, 처음에는 ThreadPool을 사용하는 목적을 부분적으로 무효로합니다). 단일 포트!

대신 작업자 스레드가 이벤트를 설정하고 모든 이벤트가 완료 될 때까지 WaitAll을 main으로 사용할 수 있습니다. 예를 들어 http://msdn.microsoft.com/en-us/library/3dasc8as.aspx을 참조하십시오.

편집 : 링크에서 참조 된 솔루션을 통해이 생각 위 (은,이 과도한 것 65000 개 이벤트의 배열을 할당하는 것을 포함 할 수 있음)뿐만 아니라 당신을 위해 이상적 아마 적습니다. .net 4에서 다음과 같이 CountdownEvent을 사용할 수 있습니다.

죄송합니다.이 예제를 http://msdn.microsoft.com/en-us/library/system.threading.countdownevent.aspx으로 확인하고 더 궁금한 점이 있으면 알려 주시기 바랍니다. 누군가가 정교하게 제안하거나 더 잘 제안 할 것입니다. 솔루션 및 솔루션을 더 .net3에 적합

+0

Ben이 머리에 못을 박는 것처럼 보입니다. 스레딩에 대해 더 알고 싶다면 SetMaxThreads()를 사용하여 명시 적으로 풀의 최대 스레드를 설정하는 것이 좋습니다. MSDN은 기본값이 풀의 250 개의 스레드라고 말합니다. 일부 유형의 조작의 경우 더 많거나 적은 수의 동시 스레드로 더 나은 성능을 얻을 수 있습니다. –

0

어떤 OS? 잊어 버리지 마십시오. 다른 버전의 XP에는 tcp 연결 제한이 있으며, DDoS 방지 기능도 제공 할 수 있습니다.

또한 논리에 결함이 있습니다. TcpClient.Connect가 예외 였기 때문에 포트가 닫히지 않았다는 의미는 아닙니다. 그 예외의 세부 사항을 캡쳐하고 표시해야합니다. 코드가 멈추는 이유에 대한 더 깊은 통찰력을 제공 할 것이라고 상상해보십시오. SocketException 또는 SecurityException도 throw 할 수 있습니다.

0

스레딩 부분과 관련하여 ThreadPool에 직접 액세스하는 대신 TPL (Task Parallel Library)을 사용할 수 있습니다. IMHO보다 간단한 사용법과보다 직관적 인/읽기 쉬운 구문을 제공합니다.