void process_recv_queue() { mRecvQueue.Switch(); bool bHadRecv = !mRecvQueue.Empty(); while (!mRecvQueue.Empty()) { var buf = mRecvQueue.Pop(); mNeedUpdateFlag = true; //跳过心跳包 if (buf.Length <= 4) { if (buf.Length == 4) { UInt32 errorCode = BitConverter.ToUInt32(buf, 0); if (m_nDisconnectError == errorCode) { UnityEngine.Debug.LogWarning("recive disconnect data...."); if (m_socketSink != null) { mConnectSucceed = false; m_socketSink.OnConnectError(m_nSocketID, SOCKET_ERROR.SOCKET_ERROR_SERVER_HANDSHAKE_DISCONNECT); } return; } } continue; } mKcp.Input(buf); for (var size = mKcp.PeekSize(); size > 0; size = mKcp.PeekSize()) { int nRecvSize = mKcp.Recv(recievebuffer); if (nRecvSize > 0) { if (m_socketSink != null) { m_socketSink.OnReceive(m_nSocketID, recievebuffer, 0, nRecvSize); } } } } //更新接收时间 if (bHadRecv) { mLastReceiveTime = iclock(); //推进一下发心跳包的时间 mLasRecieveFrame = mCurFrame; } }
private void ThreadReceive() { var packetBuffer = new PacketBuffer(); while (!m_Abort && IsConnected()) { try { int num = m_Connection.Receive(packetBuffer.buffer, packetBuffer.len, BufferSize - packetBuffer.len, SocketFlags.None); if (num > 0) { packetBuffer.len += num; int index = 0; for (; index + PacketHeaderSize <= packetBuffer.len;) { UInt16 packetLen = BitConverter.ToUInt16(packetBuffer.buffer, index); if (index + packetLen + PacketLenSize > packetBuffer.len) { break; } //回调数据包给上层处理 if (m_socketSink != null) { m_socketSink.OnReceive(m_nSocketID, packetBuffer.buffer, index + PacketHeaderSize, (int)packetLen); } index += packetLen + PacketLenSize; } int remainSize = packetBuffer.len - index; if (remainSize > 0) { Array.Copy(packetBuffer.buffer, index, packetBuffer.swapBuffer, 0, remainSize); byte[] temp = packetBuffer.buffer; packetBuffer.buffer = packetBuffer.swapBuffer; packetBuffer.swapBuffer = temp; } packetBuffer.len = remainSize; } else { if (m_socketSink != null) { m_socketSink.OnClose(m_nSocketID); } break; } } catch (SocketException e) { m_Abort = true; UnityEngine.Debug.LogErrorFormat("ThreadReceive error:{0}", e.ToString()); if (m_socketSink != null) { m_socketSink.OnConnectError(m_nSocketID, SOCKET_ERROR.SOCKET_ERROR_CONNECT_ERROR); } } catch (OverflowException e) { m_Abort = true; UnityEngine.Debug.LogErrorFormat("ThreadReceive error:{0}", e.ToString()); if (m_socketSink != null) { m_socketSink.OnConnectError(m_nSocketID, SOCKET_ERROR.SOCKET_ERROR_CONNECT_ERROR); } } } m_bRunReceive = false; }