2013-09-03 3 views
0

비동기 소켓을 사용하여 여러 클라이언트를 수신하는 서버를 개발했습니다. 클라이언트를 청취 할 때 서버를 중지하는 데 다음 방법을 사용했습니다.비동기 소켓에서 닫는 소켓

//Button 2 -- To Stop Server 
    private void button2_Click(object sender, EventArgs e) 
    { 
     socket.Shutdown(SocketShutdown.Both); 
     socket.Disconnect(false); 
     socket.Close(); 
     socket.Dispose(); 
    } 

하지만 문제는 서버를 다시 시작할 때 오류 소켓 연결이 사용 중임을 나타냅니다. 그래서 소켓을 닫고 서버를 중지하는 적절한 방법은 무엇입니까? UI에서 버튼을 누르 자마자 서버를 중지해야합니다.

+0

것은이 http://stackoverflow.com/questions/4306372/preventing-time-wait-using-net-async (A [TIME_WAIT] 같은 소리 -api) 문제. –

답변

0

서버 응용 프로그램을 종료하려면 열려있는 클라이언트 연결을 모두 닫아야합니다. 이것들은 청취 소켓을 닫을 때 이 아니고이 아닙니다 (변수가 socket이라고 가정합니다).

+1

사실은 아니지만 궁극적으로 중요합니다. 그들은 모두 약 30 초 후에 석방 될 것이며 서비스 재개를 막지 못할 것입니다. 그가 정말로 신경을 쓰는 것은 서비스를 다시 시작하고 즉시 같은 포트에 바인딩 할 수 있다는 것입니다. –

1

마지막으로 내 문제를 해결할 수있었습니다. 나는 완전히 종료 서버 수에 다음 코드를했다 사용 : -

private void button2_Click(object sender, EventArgs e) 
    { 
     if (active_clients.Count >= 0) 
     { 
      // active client is the list of sockets clients were connected before    
      //server shutdown. 
      active_clients.ForEach(delegate(Socket s) 
      { 
       try 
       { 
        s.Shutdown(SocketShutdown.Both); 
       } 
       catch (ObjectDisposedException ex) 
       { 
        if (ex.InnerException is SocketException) 
        { 
         MessageBox.Show("some message"); 
         return; 
        } 
       } 
       s.Close(); 

      }); 
      active_clients.Clear(); 
     } 
     try 
     { 
      serverSocket.Close(); 
     } 
     catch (Exception) 
     { 
      return; 
     } 
    } 
+0

앱에서 가비지 수집'GC.Collect(); '을 실행하면 문제를 해결할 수 있습니다. 롤랜드가 당신보다 아래에 언급 한 것처럼 모든 세션이 죽을 것이라는 신호를 보내야합니다. –

+1

하지만 필자는 항상 GC.Collect()를 사용하지 않는다고 읽었습니다. – prattom