2012-10-31 5 views
1

나는 비동기 소켓 서버와 클라이언트를 가지고있다. 서버에 20,000 개의 연결을 클라이언트에 요청하면 연결 대상의 약 25-30 %가 "대상 시스템이 연결을 거부했기 때문에 연결할 수 없습니다"라는 메시지가 나타납니다. 청취 소켓을 망치질하고 백 로그 대기열이 채워지는 동안 이것은 완전히 예상됩니다.적극적으로 거부 된 클라이언트 연결 예외를 처리하려면 어떻게해야합니까?

내가 가진 질문은 다음과 같습니다.이 예외가 발생하면 어떻게해야합니까? 연결을 어떻게 처리해야합니까? 종료하고 소켓을 닫은 후 다시 연결해야합니까? 또는 TCP는 프로토콜 내에서 자체 메커니즘을 통해 다시 연결을 시도합니까? 여기

이 BeginConnect()에 대한 AsyncCallbak 내 코드 OnConnected 기능이며 내가 예외를 처리하고있는 곳입니다 : 종료에 캐치에 소켓을 시도

void OnConnected(IAsyncResult ar) 
    { 
     Socket client = (Socket)ar.AsyncState; 

     try 
     {     
      client.EndConnect(ar); 
      SocketState state = new SocketState(client, m_certValidationCallback); 

      state.sslStream.BeginAuthenticateAsClient(m_remoteHostName, m_clientCertificates, m_sslProtocols, m_checkCertificateRevocation, 
        m_onAuthenticateAsClient, state); 
     } 
     catch (Exception ex) 
     { 
      //m_connectionCallback(this, new SecureConnectionResults(ex)); 

      //What do I do here? 
      if (client != null) 
      { 
       client.Shutdown(SocketShutdown.Both); //This causes an exception 
       client.Close(); 
       client.Dispose(); 
      } 
     } 
    } 

을, 또 다른 예외가 발생합니다 : "A를 소켓이 연결되어 있지 않고 (sendto 호출을 사용하여 데이터 그램 소켓을 통해 보낼 때) 주소가 제공되지 않았기 때문에 데이터 송수신 요청이 허용되지 않았습니다. "

이 예외에 따르면 소켓이 연결되지 않은 것처럼 보입니다. 다시 한번, TCP 프로토콜을 기반으로 자체적으로 다시 연결을 시도 할 예정입니까? 아니면 연결을 다시 대기시키고 다시 시도해야합니까?

답변

1

더 구체적인 예외를 발견하고이 조건에서 Shutdown()을 호출하지 않을 것입니다. TCP가 다시 연결되지 않습니다. 직접이 연결을 다시 시도해야합니다.

+0

소켓 예외를 잡아 내고 현재 연결에 대한 isConnecting 상태 부울을 설정하고 BeginConnect에 대해 다시 대기열에 넣었습니다. – Mausimo

관련 문제