// 登录相关 public int Login(string strIP, int iPort) { // 重置状态,确保socket已断开 Reset(); if (m_iState != KClientNetState.KClientNet_None) { // 状态错误,无法进行连接 return(1); } if (null == m_Sock) { m_Sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); } // 开始异步连接 m_iState = KClientNetState.KClientNet_Connecting; try { m_iRecvedLen = 0; AsyncCallback callBack = new AsyncCallback(OnConnectCallback); IPAddress ip = IPAddress.Parse(strIP); IPEndPoint iep = new IPEndPoint(ip, iPort); m_Sock.BeginConnect(iep, callBack, this); } catch { LogManager.LogError("KClientNet", "KClientNet::Login error"); } return(0); }
public void Reset() { m_iRecvedLen = 0; m_iState = KClientNetState.KClientNet_None; m_lMessageWait.Clear(); // m_Sock.Connected表示的是最近一次接收或发送时的连接状态,并不表示当前连接状态 if (null != m_Sock && m_Sock.Connected) { bool bSocketClosed = false; try { m_Sock.Shutdown(SocketShutdown.Both); } catch (SocketException e) { LogManager.LogDebug("KClientNet::Reset", String.Format("{0}:{1} ErrorCode={2}", e.ToString(), e.Message, e.ErrorCode)); } catch (ObjectDisposedException e) { bSocketClosed = true; LogManager.LogDebug("KClientNet::Reset", String.Format("success to close socket : {0}", e.Message)); } catch { LogManager.LogError("KClientNet::Reset", "unknown error"); } try { if (!bSocketClosed) { m_Sock.Close(); } } catch { LogManager.LogError("KClientNet::Reset", "socket close error"); } m_Sock = null; } }
public KClientNet() { m_iState = KClientNetState.KClientNet_None; m_lMessageWait = new LinkedList <KMessage>(); }
// 逻辑处理相关 public void Tick() { KMessage[] arMsg = null; lock (m_lMessageWait) { if (m_lMessageWait.Count > 0) { arMsg = new KMessage[m_lMessageWait.Count]; m_lMessageWait.CopyTo(arMsg, 0); m_lMessageWait.Clear(); } } if (arMsg == null) { return; } foreach (KMessage msg in arMsg) { switch (msg.ID) { case KMessage.KMessageType.KMessageType_ConnectCallback: { KMessageOnConnectCallback msgConnectcallback = (KMessageOnConnectCallback)msg; if (m_Sock.Connected) { // 连接成功 m_iState = KClientNetState.KClientNet_Connected; // 开始接收操作 try { AsyncCallback callBack = new AsyncCallback(OnRecvCallback); m_Sock.BeginReceive(m_recvBuf, 0, m_iRecvBufLen, SocketFlags.None, callBack, this); } catch (SocketException e) { string strRes = String.Format("{0}:{1} ErrorCode={2}", e.ToString(), e.Message, e.ErrorCode); LogManager.LogError("KClientNet", strRes); KMessageOnError msgE = new KMessageOnError(); msgE.m_iRez = KErrorCode.KERROR_RECV_FAILED; msgE.m_iWsaRez = e.ErrorCode; PushMessage(msgE); } catch { string strRes = String.Format("error"); LogManager.LogError("KClientNet", strRes); KMessageOnError msgE = new KMessageOnError(); msgE.m_iRez = KErrorCode.KERROR_RECV_FAILED; PushMessage(msgE); } } OnConnectEnd(msgConnectcallback.m_iRez); } break; case KMessage.KMessageType.KMessageType_OnError: { // 发生了异常 KMessageOnError msgError = (KMessageOnError)msg; OnError(msgError.m_iRez, msgError.m_iWsaRez); } break; case KMessage.KMessageType.KMessageType_OnData: { KMessageOnData msgOndata = (KMessageOnData)msg; KMessageMgr.OnProtocolExecute(msgOndata.m_iMsgId, msgOndata.m_content); } break; } } }