/// <summary> /// 合并命令处理 /// </summary> /// <param name="data"></param> internal void Merge(ref SubArray <byte> data) { try { byte[] dataArray = data.Array; ClientCommand.Command command; int receiveIndex = data.Start, receiveCount = data.EndIndex; ReturnType type; fixed(byte *dataFixed = data.Array) { byte *start; do { int receiveSize = receiveCount - receiveIndex; if (receiveSize < sizeof(uint)) { if (receiveSize == 0) { return; } break; } CommandIndex = *(uint *)(start = dataFixed + receiveIndex); if ((type = Server.GetReturnType(ref CommandIndex)) == ReturnType.Unknown) { if (receiveSize < (sizeof(uint) + sizeof(int))) { break; } if ((dataSize = *(int *)(start + sizeof(uint))) <= 0) { break; } if (dataSize > (receiveSize -= (sizeof(uint) + sizeof(int)))) { break; } receiveIndex += (sizeof(uint) + sizeof(int)); //if ((command = CommandIndex == keepCallbackCommandIndex ? keepCallbackCommand : getCommand()) != null) if ((command = CommandPool.GetCommand((int)CommandIndex)) != null) { //if (command.CommandInfo.TaskType == ClientTaskType.Synchronous) //{ // data.Set(receiveIndex, dataSize); // command.OnReceiveSynchronous(ref data); //} //else if (command.CommandInfo.IsKeepCallback == 0) command.CopyDataRunTask(dataArray, receiveIndex, dataSize); //else new CommandKeepDataTask().CopyData(command, dataArray, receiveIndex, dataSize); data.Set(receiveIndex, dataSize); command.OnReceive(ref data); } receiveIndex += dataSize; } else { onReceive(type); receiveIndex += sizeof(uint); } }while (true); } } catch (Exception error) { Log.Add(AutoCSer.Log.LogType.Error, error); } mergeError(); }