我有一个异步套接字服务器和客户端。如果我告诉客户端与服务器建立 20,000 个连接,我会在大约 25-30% 的连接中收到“无法建立连接,因为目标机器主动拒绝它”。这是完全可以预料的,因为我正在敲击监听套接字并且积压队列正在填满。
我的问题是:当我得到这个异常时我该怎么办?我应该如何处理连接,我应该关闭并关闭套接字然后尝试重新连接?还是 TCP 会尝试通过协议中自己的机制重新连接?
这是我的代码 OnConnected 函数,它是 BeginConnect() 的 AsyncCallbak,我正在处理异常:
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();
}
}
}
尝试关闭 catch 中的套接字会导致另一个异常:“由于未连接套接字并且(使用 sendto 调用在数据报套接字上发送时)未提供地址,因此不允许发送或接收数据的请求”
根据此异常,似乎套接字未连接。再次,它会尝试基于 TCP 协议自行重新连接吗?还是我应该重新排队连接并重试?