//private int m_MsgLargeCount = 0; void ReceiveCallback(IAsyncResult asyncReceive) { if (m_Socket == null) { //m_Log.InfoFormat("{0}", "Network is reading data. Socket == null"); StartReconnect(); return; } if (m_Socket.Connected == false) { //m_Log.InfoFormat("{0}", "Network is reading data. But NOT Connected"); StartReconnect(); return; } try { SocketError errorCode; int bytesReceived = m_Socket.EndReceive(asyncReceive, out errorCode); if (bytesReceived > 0) { m_msgBuffer.RecvBytes += bytesReceived; while (m_msgBuffer.RecvBytes >= sizeof(Int32)) { m_msgBuffer.MsgLength = BitConverter.ToInt32(m_msgBuffer.Buffer, m_msgBuffer.StartPos); if (m_msgBuffer.MsgLength < MsgHeader.GetHeaderLength() || m_msgBuffer.MsgLength > MsgRecvBuffer.MaxMsgLength) { //m_Log.ErrorFormat("ReceiveCallback: Invalid message, MsgLength = {0}", m_msgBuffer.MsgLength); CloseSocket(); return; } //m_Log.DebugFormat("ReceiveCallback: Loop RecvBytes = {0} StartPos = {1} MsgLength = {2}", m_msgBuffer.RecvBytes, m_msgBuffer.StartPos, m_msgBuffer.MsgLength); if (m_msgBuffer.RecvBytes >= m_msgBuffer.MsgLength) { MsgDynamic msg = new MsgDynamic(); msg.SetLength(m_msgBuffer.MsgLength); ushort uType = BitConverter.ToUInt16(m_msgBuffer.Buffer, m_msgBuffer.StartPos + 4); msg.SetMsgType(uType); int bufferLength = (int)(msg.GetLength() - msg.GetHeaderLength()); if (bufferLength > 0) { if (bufferLength > BufferPool.BufferLength) { msg.Buffer = new byte[bufferLength]; //m_Log.DebugFormat("Count {0}: Network received a too long msg type {1}({2}/{3}), length {4}", ++m_MsgLargeCount, uType, msg.GetBaseType(), msg.GetSubType(), msg.GetLength()); } else { msg.Buffer = BufferPool.GetBuffer(); } Array.Copy(m_msgBuffer.Buffer, m_msgBuffer.StartPos + msg.GetHeaderLength(), msg.Buffer, 0, bufferLength); } else if (bufferLength < 0) { //m_Log.ErrorFormat("ReceiveCallback: Invalid message, DataLength = {0}", bufferLength); CloseSocket(); return; } else { // bufferLength == 0 } m_msgQueue.Push(msg); //ushort clientMsgType; //if (m_RPCMsgs.TryGetValue(msg.GetMsgType(), out clientMsgType)) //{ // if (m_WaitForAnswer.ContainsKey(clientMsgType)) // { // m_WaitForAnswer[clientMsgType] = 0; // } //} m_msgBuffer.RecvBytes -= m_msgBuffer.MsgLength; m_msgBuffer.StartPos += m_msgBuffer.MsgLength; if (m_msgBuffer.RecvBytes >= sizeof(Int32)) { // 继续解析MsgLength continue; } else if (m_msgBuffer.RecvBytes > 0) { m_msgBuffer.MsgLength = 0; break; } else if (m_msgBuffer.RecvBytes == 0) { // 数据刚好读完,可以重新设置StartPos m_msgBuffer.StartPos = 0; m_msgBuffer.MsgLength = 0; break; } else { // (m_msgBuffer.RecvBytes < 0) 数据异常 //m_Log.ErrorFormat("ReceiveCallback: Buffer recv size error, RecvBytes = {0}, StartPos = {1}", // m_msgBuffer.RecvBytes, m_msgBuffer.StartPos); CloseSocket(); return; } } else { break; } } //m_Log.DebugFormat("ReceiveCallback: Endl RecvBytes = {0} StartPos = {1} MsgLength = {2}", m_msgBuffer.RecvBytes, m_msgBuffer.StartPos, m_msgBuffer.MsgLength); if (m_msgBuffer.MsgLength > MsgRecvBuffer.RecvBufferLength - m_msgBuffer.StartPos) { //m_Log.ErrorFormat("Debug Info: ReceiveCallback: Not enough buffer size: MsgLength {0} > (buffer total size {1} - buffer StartPos {2})", // m_msgBuffer.MsgLength, MsgRecvBuffer.RecvBufferLength, m_msgBuffer.StartPos); MoveBuffer(); } //m_Log.DebugFormat("{0}: {1}", "Network received data. Length is", bytesReceived); } else { //m_Log.InfoFormat("Network recv byte: {0}, errorCode:{1}", bytesReceived, errorCode); } ReadData(); } catch (Exception ex) // Never called, EXCEPTION WHERE ARE YOU??? { m_NetworkFailState = (int)NetworkFailState.Receive; CloseSocket(); //m_Log.WarnFormat("Network ReceiveCallback Exception: {0} / {1}", ex.ToString(), ex.Message); } }