コード例 #1
0
        // 登录相关
        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);
        }
コード例 #2
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;
            }
        }
コード例 #3
0
 public KClientNet()
 {
     m_iState       = KClientNetState.KClientNet_None;
     m_lMessageWait = new LinkedList <KMessage>();
 }
コード例 #4
0
        // 逻辑处理相关
        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;
                }
            }
        }