private void connectedCallBack(IAsyncResult result)
{
lock (_lock2)
{
try
{
SocketArg listener = (SocketArg)result.AsyncState;
listener.client.EndConnect(result);
ClientList.Add(listener.client, listener.coder);
Thread idps = new Thread(HCAcquisitionDataCallBack);
idps.Name = "IO:" + idps.ManagedThreadId.ToString();
idps.IsBackground = false;
idps.Start(listener.client);
}
catch (SocketException ex)
{
//10060连接到对方后一段时间没有得到正确答复或者连接的主机没有反应
//10061已经找到对方但是被对方拒绝
//10054 重新启用已经存在的socket
string msg;
if (ex.NativeErrorCode.Equals(10060))
{
//无法连接目标主机
msg = string.Format("{0} 无法连接: error code {1}!", "", ex.NativeErrorCode);
LogHelper.error(msg);
//goto startOperation;
}
else if (ex.NativeErrorCode.Equals(10061))
{
msg = string.Format("{0} 主动拒绝正在重连: error code {1}!", "", ex.NativeErrorCode);
LogHelper.error(msg);
//goto startOperation;
}
else if (ex.NativeErrorCode.Equals(10053))
{
//读写时主机断开
msg = string.Format("{0} 主动断开连接: error code {1}! ", "", ex.NativeErrorCode);
}
else
{
//其他错误
msg = string.Format("Disconnected: error code {0}!", ex.NativeErrorCode);
}
LogHelper.error(msg);
//1S后从新连接目标主机
//Thread.Sleep(1000);
//goto startOperation;
}
}
}
------解决思路----------------------
什么参数也不用。
只有 listener.client.EndConnect(result); 这一句话需要try..catch,你怎么能弄一个“大的”try...catch来蒙自己呢?难道别的语句出错了、你也需要反复连接?
在 EndConnect 出错之后,你可以抛出(触发)事件。
负责启动连接程序的宿主程序应该捕获事件,那里的逻辑才应该考虑什么重新连接的问题。例如它可能写
var gateway = new GateWay("172.168.9.12", 33881);
int times=20;
gateway.ConnectError += (s,e)=>
{
if(times==0)
throw new Exception("玩完了。");
else
{
times--;
if(! gateway.IsConnected)
gateway.Start();
}
}
gateway.Start();
当然这只是随便举例。更多可能是,程序给用户一个提示,然后启动一个 timer,5分钟以后才重新连接。