/** io线程 */ private void onSocketReceiveAsync(IAsyncResult ar) { int len = 0; bool hasError = false; try { len = _socket.EndReceive(ar); } catch (Exception e) { len = 0; hasError = true; // Ctrl.printExceptionForIO(e); } if (len > 0) { if (!onReceived(len)) { hasError = true; } } if (!hasError) { beginReceive(); } else { if (_socket.Connected) { Ctrl.printForIO("preBeClose3 出错时,依然判定连接中"); } preBeClose(3); } }
/** 主线程 */ private void toConnectOnce() { Ctrl.print("connectOnce"); createNewContent(); if (_currentInfo == null) { Ctrl.errorLog("此时不该没有currentInfo"); toGetDNS(); return; } _hostAddress = _currentInfo.getOnce(); _state = Connecting; _connectTime = 0; ++_currentTryCount; Ctrl.printForIO("toConnect一次:" + _hostAddress, _content.GetHashCode()); _content.connect(_hostAddress, _port); }
/** 读失败(IO线程) */ protected void onError(string msg) { Ctrl.printForIO("socket读取失败:" + msg); preBeClose(2); }
private void toGetDNS() { _state = Connecting; _connectTime = 0; int index = ++_doIndex; _currentInfo = _ipInfoDic.get(_host); if (_currentInfo != null) { preConnectAfterAddress(); } else { IPAddress address; if (!IPAddress.TryParse(_host, out address)) { Ctrl.debugLog("dns上"); Dns.BeginGetHostAddresses(_host, v => { IPAddress[] addresses = null; try { addresses = Dns.EndGetHostAddresses(v); } catch (Exception e) { Ctrl.printExceptionForIO(e); } ThreadControl.addMainFunc(() => { if (index == _doIndex) { if (addresses != null) { foreach (IPAddress ipAddress in addresses) { Ctrl.print("dns看收到的上地址", ipAddress); } _currentInfo = registIPInfo(_host, addresses); preConnectAfterAddress(); } else { Ctrl.printForIO("解析dns失败"); } } else { Ctrl.print("dns获取完,已经到下个index"); } }); }, null); } else { Ctrl.debugLog("dns下"); _currentInfo = registIPInfo(_host, new[] { address }); preConnectAfterAddress(); } } }