/// <summary> /// Called when the client receives bytes /// </summary> /// <param name="numBytes">The number of bytes received</param> public void ReceiveBytes(int numBytes) { lock (this) { byte[] buffer = m_client.PacketBuf; //End Offset of buffer int bufferSize = m_client.PacketBufSize + numBytes; //log.Debug(Marshal.ToHexDump("Recieve:", buffer, 0, bufferSize)); //Size < minimum if (bufferSize < GSPacketIn.HDR_SIZE) { m_client.PacketBufSize = bufferSize; // undo buffer read return; } //Reset the offset m_client.PacketBufSize = 0; int curOffset = 0; do { //read buffer length int packetLength = 0; int header = 0; if (m_client.Encryted) { //int key = receive_fsm.getState(); int i = receive_fsm.count; //key = (key & (0xff << 16)) >> 16; byte[] tempKey = cloneArrary(m_client.RECEIVE_KEY); while (curOffset + 4 < bufferSize) { byte[] tempBuffer = decryptBytes(buffer,curOffset, 8, tempKey); header = ((byte)(tempBuffer[0] ) << 8) + (byte)(tempBuffer[1]); if (header == GSPacketIn.HEADER) { packetLength = ((byte)(tempBuffer[2]) << 8) + (byte)(tempBuffer[3]); break; } else { curOffset++; } } //decryptBytes(buffer, } else { while(curOffset + 4 < bufferSize) { header = (buffer[curOffset] << 8) + buffer[curOffset + 1]; if (header == GSPacketIn.HEADER) { packetLength = (buffer[curOffset + 2] << 8) + buffer[curOffset + 3]; break; } else { curOffset++; } } } if ((packetLength != 0 && packetLength < GSPacketIn.HDR_SIZE) || packetLength > 2048) { log.Error("packetLength:" + packetLength + ",GSPacketIn.HDR_SIZE:" + GSPacketIn.HDR_SIZE + ",offset:" + curOffset + ",bufferSize:" + bufferSize + ",numBytes:" + numBytes); log.ErrorFormat("Err pkg from {0}:", m_client.TcpEndpoint); log.Error(Marshal.ToHexDump("===> error buffer", buffer)); m_client.PacketBufSize = 0; if (m_client.Strict) { m_client.Disconnect(); } return; } int dataLeft = bufferSize - curOffset; if (dataLeft < packetLength || packetLength == 0) { Array.Copy(buffer, curOffset, buffer, 0, dataLeft); m_client.PacketBufSize = dataLeft; break; } GSPacketIn pkg = new GSPacketIn(new byte[2048],2048); if (m_client.Encryted) { // pkg.CopyFrom(buffer, curOffset, 0, packetLength, receive_fsm.getState()); pkg.CopyFrom3(buffer, curOffset, 0, packetLength, m_client.RECEIVE_KEY); //receive_fsm.UpdateState(); } else { pkg.CopyFrom(buffer, curOffset, 0, packetLength); } pkg.ReadHeader(); log.Debug((Marshal.ToHexDump("Recieve Packet:", pkg.Buffer, 0, packetLength))); try { m_client.OnRecvPacket(pkg); } catch (Exception e) { if (log.IsErrorEnabled) log.Error("HandlePacket(pak)", e); } curOffset += packetLength; } while (bufferSize - 1 > curOffset); if (bufferSize - 1 == curOffset) { buffer[0] = buffer[curOffset]; m_client.PacketBufSize = 1; } } }
/// <summary> /// Called when the client receives bytes /// </summary> /// <param name="numBytes">The number of bytes received</param> public void ReceiveBytes(int numBytes) { // UnityEngine.Debug.Log("Nhan duoc pkg"); lock (this) { byte[] buffer = m_client.PacketBuf; int bufferSize = m_client.PacketBufSize + numBytes; if (bufferSize < 20) { // UnityEngine.Debug.Log("bufferSize < 20"); m_client.PacketBufSize = bufferSize; } else { // UnityEngine.Debug.Log("bufferSize >= 20"); m_client.PacketBufSize = 0; int curOffset = 0; do { int packetLength = 0; int header3 = 0; if (m_client.Encryted) { // UnityEngine.Debug.Log("m_client.Encryted"); int i = receive_fsm.count; byte[] tempKey = cloneArray(m_client.RECEIVE_KEY); for (; curOffset + 4 < bufferSize; curOffset++) { byte[] tempBuffer = decryptBytes(buffer, curOffset, 8, tempKey); header3 = (tempBuffer[0] << 8) + tempBuffer[1]; if (header3 == 29099) { packetLength = (tempBuffer[2] << 8) + tempBuffer[3]; break; } } } else { // UnityEngine.Debug.Log("NOT m_client.Encryted"); for (; curOffset + 4 < bufferSize; curOffset++) { header3 = (buffer[curOffset] << 8) + buffer[curOffset + 1]; if (header3 == 29099) { packetLength = (buffer[curOffset + 2] << 8) + buffer[curOffset + 3]; break; } } } if ((packetLength != 0 && packetLength < 20) || packetLength > 8192) { // UnityEngine.Debug.Log("[Err] packetLength:" + packetLength + ",GSPacketIn.HDR_SIZE:" + (ushort)20 + ",offset:" + curOffset + ",bufferSize:" + bufferSize + ",numBytes:" + numBytes); // UnityEngine.Debug.Log("[Err] pkg from "+ m_client.TcpEndpoint); m_client.PacketBufSize = 0; if (m_client.Strict) { m_client.Disconnect(); } return; } int dataLeft = bufferSize - curOffset; if (dataLeft < packetLength || packetLength == 0) { // UnityEngine.Debug.Log("dataLeft < packetLength || packetLength == 0"); Array.Copy(buffer, curOffset, buffer, 0, dataLeft); m_client.PacketBufSize = dataLeft; break; } GSPacketIn pkg = new GSPacketIn(new byte[8192], 8192); if (m_client.Encryted) { pkg.CopyFrom3(buffer, curOffset, 0, packetLength, m_client.RECEIVE_KEY); } else { pkg.CopyFrom(buffer, curOffset, 0, packetLength); } pkg.ReadHeader(); // UnityEngine.Debug.Log(Marshal.ToHexDump("Recieve Packet:", pkg.Buffer, 0, packetLength)); try { m_client.OnRecvPacket(pkg); } catch (Exception e) { if (log.IsErrorEnabled) { UnityEngine.Debug.Log("HandlePacket(pak)" + e); } } curOffset += packetLength; }while (bufferSize - 1 > curOffset); if (bufferSize - 1 == curOffset) { buffer[0] = buffer[curOffset]; m_client.PacketBufSize = 1; } } } }
/// <summary> /// Called when the client receives bytes /// </summary> /// <param name="numBytes">The number of bytes received</param> public void ReceiveBytes(int numBytes) { lock (this) { byte[] buffer = m_client.PacketBuf; //End Offset of buffer int bufferSize = m_client.PacketBufSize + numBytes; //log.Debug(Marshal.ToHexDump("Recieve:", buffer, 0, bufferSize)); //Size < minimum if (bufferSize < GSPacketIn.HDR_SIZE) { m_client.PacketBufSize = bufferSize; // undo buffer read return; } //Reset the offset m_client.PacketBufSize = 0; int curOffset = 0; do { //read buffer length int packetLength = 0; int header = 0; if (m_client.Encryted) { //int key = receive_fsm.getState(); int i = receive_fsm.count; //key = (key & (0xff << 16)) >> 16; byte[] tempKey = cloneArrary(m_client.RECEIVE_KEY); while (curOffset + 4 < bufferSize) { byte[] tempBuffer = decryptBytes(buffer, curOffset, 8, tempKey); header = ((byte)(tempBuffer[0]) << 8) + (byte)(tempBuffer[1]); if (header == GSPacketIn.HEADER) { packetLength = ((byte)(tempBuffer[2]) << 8) + (byte)(tempBuffer[3]); break; } else { curOffset++; } } //decryptBytes(buffer, } else { while (curOffset + 4 < bufferSize) { header = (buffer[curOffset] << 8) + buffer[curOffset + 1]; if (header == GSPacketIn.HEADER) { packetLength = (buffer[curOffset + 2] << 8) + buffer[curOffset + 3]; break; } else { curOffset++; } } } if ((packetLength != 0 && packetLength < GSPacketIn.HDR_SIZE) || packetLength > 2048) { log.Error("packetLength:" + packetLength + ",GSPacketIn.HDR_SIZE:" + GSPacketIn.HDR_SIZE + ",offset:" + curOffset + ",bufferSize:" + bufferSize + ",numBytes:" + numBytes); log.ErrorFormat("Err pkg from {0}:", m_client.TcpEndpoint); log.Error(Marshal.ToHexDump("===> error buffer", buffer)); m_client.PacketBufSize = 0; if (m_client.Strict) { m_client.Disconnect(); } return; } int dataLeft = bufferSize - curOffset; if (dataLeft < packetLength || packetLength == 0) { Array.Copy(buffer, curOffset, buffer, 0, dataLeft); m_client.PacketBufSize = dataLeft; break; } GSPacketIn pkg = new GSPacketIn(new byte[2048], 2048); if (m_client.Encryted) { // pkg.CopyFrom(buffer, curOffset, 0, packetLength, receive_fsm.getState()); pkg.CopyFrom3(buffer, curOffset, 0, packetLength, m_client.RECEIVE_KEY); //receive_fsm.UpdateState(); } else { pkg.CopyFrom(buffer, curOffset, 0, packetLength); } pkg.ReadHeader(); log.Debug((Marshal.ToHexDump("Recieve Packet:", pkg.Buffer, 0, packetLength))); try { m_client.OnRecvPacket(pkg); } catch (Exception e) { if (log.IsErrorEnabled) { log.Error("HandlePacket(pak)", e); } } curOffset += packetLength; } while (bufferSize - 1 > curOffset); if (bufferSize - 1 == curOffset) { buffer[0] = buffer[curOffset]; m_client.PacketBufSize = 1; } } }
public void ReceiveBytes(int numBytes) { Monitor.Enter(this); try { byte[] packetBuf = this.m_client.PacketBuf; int num = this.m_client.PacketBufSize + numBytes; if (num < 20) { this.m_client.PacketBufSize = num; } else { this.m_client.PacketBufSize = 0; int num2 = 0; int num3; int num5; while (true) { num3 = 0; if (this.m_client.Encryted) { int count = this.receive_fsm.count; byte[] param = StreamProcessor.cloneArrary(this.m_client.RECEIVE_KEY, 8); while (num2 + 4 < num) { byte[] array = StreamProcessor.decryptBytes(packetBuf, num2, 8, param); int num4 = ((int)array[0] << 8) + (int)array[1]; if (num4 == 29099) { num3 = ((int)array[2] << 8) + (int)array[3]; break; } num2++; } } else { while (num2 + 4 < num) { int num4 = ((int)packetBuf[num2] << 8) + (int)packetBuf[num2 + 1]; if (num4 == 29099) { num3 = ((int)packetBuf[num2 + 2] << 8) + (int)packetBuf[num2 + 3]; break; } num2++; } } if ((num3 != 0 && num3 < 20) || num3 > 16869) { break; } num5 = num - num2; if (num5 < num3 || num3 == 0) { goto Block_11; } GSPacketIn gSPacketIn = new GSPacketIn(new byte[16869], 16869); if (this.m_client.Encryted) { gSPacketIn.CopyFrom3(packetBuf, num2, 0, num3, this.m_client.RECEIVE_KEY); } else { gSPacketIn.CopyFrom(packetBuf, num2, 0, num3); } gSPacketIn.ReadHeader(); StreamProcessor.log.Debug(Marshal.ToHexDump("Recieve Packet:", gSPacketIn.Buffer, 0, num3)); try { this.m_client.OnRecvPacket(gSPacketIn); } catch (Exception exception) { if (StreamProcessor.log.IsErrorEnabled) { StreamProcessor.log.Error("HandlePacket(pak)", exception); } } num2 += num3; if (num - 1 <= num2) { goto IL_332; } } StreamProcessor.log.Error(string.Concat(new object[] { "packetLength:", num3, ",GSPacketIn.HDR_SIZE:", 20, ",offset:", num2, ",bufferSize:", num, ",numBytes:", numBytes })); StreamProcessor.log.ErrorFormat("Err pkg from {0}:", this.m_client.TcpEndpoint); StreamProcessor.log.Error(Marshal.ToHexDump("===> error buffer", packetBuf)); this.m_client.PacketBufSize = 0; if (this.m_client.Strict) { this.m_client.Disconnect(); goto IL_228; } goto IL_228; Block_11: Array.Copy(packetBuf, num2, packetBuf, 0, num5); this.m_client.PacketBufSize = num5; IL_332: if (num - 1 == num2) { packetBuf[0] = packetBuf[num2]; this.m_client.PacketBufSize = 1; } IL_228 :; } } finally { Monitor.Exit(this); } }