2017-05-18 1 views
0

최근 Socket을 사용하여 서버 - 다중 클라이언트 응용 프로그램 개발을 시작했습니다.소켓 서버에 연결된 각 소켓 클라이언트 처리

서버는 연결된 클라이언트를 추적 할 필요가 없습니다. 연결을 요청하는 클라이언트가 있으면 서버가이를 허용합니다. 클라이언트로부터 요청이 있으면 (일부 데이터를 얻으려면) 서버는 해당 클라이언트에 응답합니다.

/// <summary> 
/// Callback when server accepts a new incoming connection. 
/// </summary> 
/// <param name="result">Incoming connection result object.</param> 
private void AcceptedCallback(IAsyncResult result) 
{ 
    try 
    { 
     Socket clientSocket = _socket.EndAccept(result); // Asynchronously accepts an incoming connection attempt 

     if (clientSocket.Connected) // Check if the client is in 'Connected' state 
     { 
     StateObject state = new StateObject(); 
     state.clientSocket = clientSocket; 
     clientSocket.BeginReceive(state.buffer, 0, StateObject.BufferSize, SocketFlags.None, // Start listening to client request 
            ReceiveCallback, state); 
     } 
     else 
     { 
      clientSocket.Close(); // Terminate that client's connection 
     Log.writeLog("TCPServer(AcceptedCallback)" 
        , "Client's status is not connected."); 
     } 
    } 
    catch (Exception ex) 
    { 
     Log.writeLog("TCPServer(AcceptedCallback)" 
       , ex.Message); 
     clientSocket.Close(); 
    } 
    finally 
    { 
     Accept(); // Start to accept new connection request 
    } 
} 

내가 3이에 대한 질문이 : 나는 새로 연결된 클라이언트에 대해 작성하는 각 BeginReceive를 들어

  1. 을 내 서버 응용 프로그램이 있음을 보유 할 새 스레드/객체를 생성하지 고객?

  2. 클라이언트가 연결되고 네트워크 케이블이 클라이언트 측에서 제거되어 다시 연결되면 클라이언트는 서버에 다시 연결하며이 시나리오에서는 서버에 새 연결로 간주됩니다 다시 발생하고, 내 서버 프로그램이 충돌합니까?

  3. 따라서 서버에 연결된 각 클라이언트를 추적하고 해당 상태를 추적하여 해당 서버에서 닫기/삭제를 호출 할 수 있습니까?

시나리오 2에 대한 나의 테스트에서, 서버 프로그램에는 이상이 발견되지 않았지만, 누군가 나를 위해이를 명확히하는 데 도움이되기를 바랍니다. 고맙습니다.

답변

0
  1. 아니요, 스레드 풀의 IO 완료 스레드를 사용합니다.
  2. 아니요, 코드를 작성하고 이에 맞게 처리해야합니다. OS가 감지 할 수있는 클라이언트 측에서 문제가 발생하면 TCP fin/ack를 서버로 보냅니다. 이렇게하면 BeginXXX 메소드가 여전히 비동기 콜백 메소드를 기다리는 결과를 초래합니다. 거기에서 EndXXX 메서드를 호출하면 예외가 throw되거나 소켓에서 0 바이트가 읽혀집니다.
  3. 이 정보는 정보를 적절히 처리하는 것을 의미합니다. 오류를 발견 한 경우 해당 코드를 처분하는 것이 아니라면 코드를 정리하여 EndXXX 메소드에 넣을 수 있습니다. 서버를 종료하면 정상적으로 클라이언트에 신호를 보낼 수 있다는 의미라면 그렇다.
+0

신속한 답장을 보내 주셔서 감사합니다. 회신에 따라 결론은 다음과 같습니다. 1. 연결된 각 클라이언트에 대해 추가 메모리/리소스가 생성되지 않습니다. 2. "거기에서 EndXXX 메서드 호출이 예외를 throw하거나 소켓에서 읽는 0 바이트를 반환해야합니다."와 같은 상황을 처리 할 정리 코드가 있지만 폐기/닫기를 호출 할 필요가 없습니다. (서버 프로그램에서)이 오류를 일으키는 클라이언트에서. 내가 틀렸다고 정정하십시오. – Ytan

+0

1. 스레드를 만들 필요가 없습니다. OS별로 처리됩니다. 2. 아마 가까이 다가 가거나 처분 할 필요가 없을 것이며, 그렇게한다면 아마 ObjectAlreadyDisposed 예외가 발생할 것입니다. 그러나 당신은 그렇게 할 수 있으며, 대부분은 어쨌든 100 % 확신 할 수 있습니다. 이 경우에는 거의 예상되므로 ObjectAlreadyDisposedException을 catch합니다. – uriDium

+0

알았어, 고마워,이 사건을 지금 당장 생각해. – Ytan

관련 문제