当前位置: 代码迷 >> C# >> Socket的BeginConnect 连接失败,怎么在回调函数中利用传过来的参数再次进异步重连?行
  详细解决方案

Socket的BeginConnect 连接失败,怎么在回调函数中利用传过来的参数再次进异步重连?行

热度:79   发布时间:2016-05-05 04:52:10.0
Socket的BeginConnect 连接失败,如何在回调函数中利用传过来的参数再次进异步重连?行
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分钟以后才重新连接。
  相关解决方案