/// <summary> /// Raises the recv thread event. /// </summary> public void OnRecvThread() { NetTcpStateObject netState = new NetTcpStateObject(); netState.workSocket = socket; try{ while (true) { if (!Connected()) { break; } int nReadBytes = socket.Receive(netState.buffer, netState.writeOffset, NetTcpStateObject.BufferSize - netState.writeOffset, SocketFlags.None); if (nReadBytes <= 0) { break; } nReadBytes += netState.writeOffset; int nIndex = netState.readOffset; int nPacketSize = 0; while (nIndex < nReadBytes) { int nOffset = netState.readOffset; nPacketSize = BitConverter.ToInt32(netState.buffer, nOffset); if (nIndex + sizeof(int) + nPacketSize <= nReadBytes) { nOffset += sizeof(int); INetPacket packet = new INetPacket(); packet.Set(nPacketSize, netState.buffer, nOffset); if (packet.Type != 0) { PostPacket(packet); } netState.readOffset += (sizeof(int) + nPacketSize); } nIndex += (sizeof(int) + nPacketSize); } if (nIndex == nReadBytes) { netState.readOffset = 0; netState.writeOffset = 0; } else { if (netState.readOffset + nPacketSize > NetTcpStateObject.BufferSize) { byte[] newBuffer = new byte[NetTcpStateObject.BufferSize]; int bytesCopy = nReadBytes - netState.readOffset; Buffer.BlockCopy(netState.buffer, netState.readOffset, newBuffer, 0, bytesCopy); netState.buffer = newBuffer; netState.readOffset = 0; netState.writeOffset = bytesCopy; #if UNITY_EDITOR UnityEngine.Debug.Log(string.Format("Receive create new buffer readOffset({0}) packetSize({1}) writeOffset({2})", netState.readOffset, nPacketSize, netState.writeOffset)); #endif } else { netState.writeOffset = nReadBytes; } } } } catch (Exception e) { #if UNITY_EDITOR UnityEngine.Debug.LogError(e.Message); #endif PostPacket( new INetPacket(PacketType.SOCKET_DISCONNECT) ); } // close net recv thread Close(); recvThread.Abort(); }