override protected void OnRead(byte[] data, int len, ref EndPoint addr) { byte[] msg = null; Packet msgPk = null; int pos = 0, size = 0, msglen; try { if (0 < length) { size = length + len; if (PACKAGE_HEADER_SIZE > size) { if (BUFFER_SIZE >= size) { Array.Copy(data, 0, buffer, length, len); length = size; } else { Debug.LogWarning("Close===========2"); close(); } return; } if (PACKAGE_HEADER_SIZE > length) { pos = PACKAGE_HEADER_SIZE - length; Array.Copy(data, 0, buffer, length, pos); length += pos; len -= pos; } //message version if (PACKAGE_IDENTIFY == buffer[0]) { //msg length msglen = BitConverter.ToInt16(buffer, 2); msglen = IPAddress.NetworkToHostOrder((short)msglen); if (length + len >= msglen) { size = msglen - length; msg = new byte[msglen - PACKAGE_HEADER_SIZE]; Array.Copy(buffer, PACKAGE_HEADER_SIZE, msg, 0, length - PACKAGE_HEADER_SIZE); Array.Copy(data, pos, msg, length - PACKAGE_HEADER_SIZE, size); pos += size; len -= size; msgPk = new Packet(); msgPk.data = (0 == buffer[1]) ? AESCrypt.Decrypt(msg, AESCrypt.KEY) : msg; DEBUG.NetworkServer(data[1], data); if (null != msgPk.data) { ev.WaitOne(); list.Add(msgPk); ev.Set(); } else { Debug.LogWarning("Close========3"); close(); return; } } else { size = length + len; if (BUFFER_SIZE >= size) { Array.Copy(data, pos, buffer, length, len); length = size; } else { Debug.LogWarning("Close========4"); close(); } return; } } else { Debug.LogWarning("Close=========5"); close(); return; } } while (PACKAGE_HEADER_SIZE <= len) { //message version if (PACKAGE_IDENTIFY == data[pos]) { //msg length msglen = BitConverter.ToInt16(data, pos + 2); msglen = IPAddress.NetworkToHostOrder((short)msglen); if (BUFFER_SIZE < msglen) { Debug.LogWarning("Close=========6"); close(); return; } else if (len >= msglen) { msg = new byte[msglen - PACKAGE_HEADER_SIZE]; Array.Copy(data, pos + PACKAGE_HEADER_SIZE, msg, 0, msg.Length); msgPk = new Packet(); msgPk.data = (0 == data[pos + 1]) ? AESCrypt.Decrypt(msg, AESCrypt.KEY) : msg; pos += msglen; len -= msglen; if (null != msgPk.data) { ev.WaitOne(); list.Add(msgPk); ev.Set(); } else { Debug.LogWarning("Close=========7"); close(); return; } } else { break; } } else { Debug.LogWarning("Close=========8"); close(); return; } } Array.Copy(data, pos, buffer, 0, len); length = len; } catch (Exception e) { DEBUG.Networking(DEBUG.TRACER_LOG + "NetConnection.OnRead, exp: " + e.Message, LogType.Exception); } }