나는 비동기 소켓 서버와 클라이언트를 가지고있다. 서버에 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 프로토콜을 기반으로 자체적으로 다시 연결을 시도 할 예정입니까? 아니면 연결을 다시 대기시키고 다시 시도해야합니까?
소켓 예외를 잡아 내고 현재 연결에 대한 isConnecting 상태 부울을 설정하고 BeginConnect에 대해 다시 대기열에 넣었습니다. – Mausimo