예제 #1
0
        public override void OnRecvData(byte[] bytes, int dataBegin, int dataLen)
        {
            int bytesOffset = dataBegin;
            int bytesEnd    = dataBegin + dataLen;

            while (bytesOffset < bytesEnd)
            {
                if (m_parseBufferOffset < CONTENT_LEN_DESCRIPT_SIZE)
                {
                    int copyLen = CONTENT_LEN_DESCRIPT_SIZE - m_parseBufferOffset;
                    if (copyLen > bytesEnd - bytesOffset)
                    {
                        copyLen = bytesEnd - bytesOffset;
                    }
                    Array.Copy(bytes, bytesOffset, m_parseBuffer, m_parseBufferOffset, copyLen);
                    bytesOffset         += copyLen;
                    m_parseBufferOffset += copyLen;
                    if (bytesOffset >= bytesEnd)
                    {
                        break;
                    }
                }
                int ctxLen = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(m_parseBuffer, 0));
                if (ctxLen > PROTOCOL_MAX_SIZE || ctxLen < PROTOCOL_LEN_DESCRIPT_SIZE)
                {
                    AppLog.Info("OnSocketRecvData ctxLen " + ctxLen.ToString());
                    m_netAgent.Close();
                    return;
                }

                {
                    int copyLen = CONTENT_LEN_DESCRIPT_SIZE + ctxLen - m_parseBufferOffset;
                    if (copyLen > bytes.Length - bytesOffset)
                    {
                        copyLen = bytes.Length - bytesOffset;
                    }
                    Array.Copy(bytes, bytesOffset, m_parseBuffer, m_parseBufferOffset, copyLen);
                    bytesOffset         += copyLen;
                    m_parseBufferOffset += copyLen;
                    if (m_parseBufferOffset >= CONTENT_LEN_DESCRIPT_SIZE + ctxLen)
                    {
                        int protocolId    = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(m_parseBuffer, CONTENT_LEN_DESCRIPT_SIZE));
                        int protobufBegin = CONTENT_LEN_DESCRIPT_SIZE + PROTOCOL_LEN_DESCRIPT_SIZE;
                        int protobufLen   = m_parseBufferOffset - protobufBegin;
                        m_parseBufferOffset = 0;
                        try
                        {
                            this.OnRecvMsg(protocolId, m_parseBuffer, protobufBegin, protobufLen);
                        }
                        catch (Exception e)
                        {
                            AppLog.Exception(e);
                        }
                    }
                }
            }
        }
예제 #2
0
        void OnSocketClose()
        {
            m_state     = NetAgentState.Closed;
            m_error_num = m_socket.GetErrorNum();
            m_error_msg = m_socket.GetErrorMsg();
            if (null != m_handler)
            {
                m_handler.OnClose(m_error_num, m_error_msg);
            }

            AppLog.Info("OnSocketClose");
        }
예제 #3
0
        void OnSocketOpen(bool isSucc)
        {
            m_state = isSucc ? NetAgentState.Connected : NetAgentState.Closed;

            if (null != m_handler)
            {
                m_handler.OnOpen(isSucc);
            }
            if (!isSucc)
            {
                this.Close();
            }

            AppLog.Info("OnSocketOpen");
        }