2014-10-24 2 views
0

특정 포트에서 들어오는 데이터를 모니터링하기 위해 TCPListener 콘솔 앱을 만들어야합니다. 나는 잠시 검색하고 난 LINQPad를 통해 실행 다음과 같은 코드가 있습니다TCPListener가 새 연결을 차단합니다.

void Main() 
{ 
    IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); 

    Console.WriteLine("Starting TCP listener..."); 

    TcpListener listener = new TcpListener(ipAddress, 1005); 
    try 
    { 

     listener.Start(); 
     while (true) 
     { 
      Socket client = listener.AcceptSocket(); 
      client.ReceiveTimeout.Dump(); 
      Console.WriteLine("Connection accepted."); 

      var childSocketThread = new Thread(() => 
      { 
       Byte[] bytes = new Byte[256]; 
       String data = null; 
       int i; 
       while((i = client.Receive(bytes))!=0 && data != "55AA") 
       { 
        data = System.Text.Encoding.ASCII.GetString(bytes, 0, i); 
       } 
       Console.WriteLine("connection closing"); 
       client.Close(); 

       //throw new Exception(); 
      }); 
      childSocketThread.Start(); 
     } 

     listener.Stop(); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine("Error: " + e.StackTrace); 
     Console.ReadLine(); 
    } 

} 

이 실제로 구글의 예제 수백만의 약간 수정 된 코드입니다. 내 문제는 LINQPad에있는 것이 보통 실행 버튼을 누른 다음 명령 프롬프트를 열고 127.0.0.1 포트 1005로 텔넷을 연결 한 다음 모두 좋은 것을 씁니다.

나는 다음과 같은 오류와 끝까지 다시 실행 한 후 Enter 키를 누릅니다 LINQPad에서 정지 버튼을 누른 경우

Error: at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) at System.Net.Sockets.Socket.Bind(EndPoint localEP) at System.Net.Sockets.TcpListener.Start(Int32 backlog) at System.Net.Sockets.TcpListener.Start() at UserQuery.Main() in c:\Users\giannis\AppData\Local\Temp\LINQPad_jncifzyi\query_lgowqr.cs:line 40

을 이제 난 당신이 하나의 클라이언트 만 listening 또는 using 특정 포트가있을 수 있음을 이해 ,하지만 내 문제는 그 중 첫 번째는 LINQPad 실제 솔루션으로 이동하기 전에 놀고 싶습니다. TCPListener 변수를 전역 변수로 만들 수 있고 프로그램을 종료 할 때 처리 할 수 ​​있다는 것을 알고 있습니다. 하지만 충돌이 생기면 어떨까요? 로그온을 로그 오프 할 때까지 포트에 연결할 수 없게 될까요?

답변

1

아마도 GC는 LINQPad에서 프로그램을 다시 시작할 때 청취자를 정리하지 않았을 수 있습니다. 실제 프로그램에서 모든 TCP 포트는 프로세스가 종료 될 때 정리됩니다. LINQPad를 다시 시작하면 포트가 다시 사용 가능 상태가됩니다.

왜 Visual Studio 프로젝트를 사용하면 코드를 신속하게 테스트 할 때 더 많은 부담이 될지 모르겠습니다. F5를 누르면됩니다. 그러나 덤핑 기능은 없다.

+0

솔직히 말해서 여기에 대한 답변을 기다리는 동안 나는 정확하게 그 일을 시작했고 프로젝트를 시작했습니다. 그리고 그것은 모두 괜찮은 것 같습니다 :-). 하지만 평소에 놀아서 바로 개발을 시작하지 않으려 고 할 때 LINQPad는 제 친구입니다. 그런 경우에는 아닐 수도 있습니다. –

+0

나는 청취자를 멈추기 위해 응용 프로그램의 종료를 처리 할 필요가 없다. –

+0

어쨌든'using'으로 리소스를 포장해야합니다. 그게 너를 구해 줄 수 있을지도 모른다. – usr

0

내 문제가 있었다 LINQPad 당신이 그것을 취소 후 실행중인 프로세스를 유지있다.

"모든 스레드 취소 및 재설정"메뉴 옵션 (ctrl + shift + F5)을 사용하거나 작업 관리자의 모든 "LINQPad.UserQuery.exe"프로세스를 수동으로 종료하십시오.

포트는 다시 사용 가능해야합니다.

관련 문제