int Connections::CompleteSend(DWORD TransferedBytes) { UNREFERENCED_PARAMETER(TransferedBytes); FUNCTION_BEGIN(); IncreaseBytesSend(TransferedBytes); _mutexSend.Lock(); _sendBuffer.IncreasePopPos(TransferedBytes); int rc = 0; if (IsSetControlFlag(CONTROL_FLAG_USE_SEND_QUEUE)) { Packet * SendPacket = _sendQueue.PeekPacket(); while (SendPacket) { if (_sendBuffer.GetPushAvailableSize() <= SendPacket->GetUsedSize()) { break; } BYTE Sequence = (BYTE)(_PacketSendCount & PACKET_MAX_SEQUENCE); SetSequence(SendPacket->GetPacketHeader(), Sequence); if (_PacketEncoder) { rc = _PacketEncoder->TxEncrypt(*SendPacket); if (0 != rc) { _mutexSend.Unlock(); Logger::Log("Session[%X] TxEncrypt Error[%d]\n", this, rc); return 1; //ERR_NET_PACKET_ENCRYPT_FAIL } } memcpy(_sendBuffer.GetQueuePushPtr(), SendPacket->GetPacketBuffer(), SendPacket->GetUsedSize()); _sendBuffer.IncreasePushPos(SendPacket->GetUsedSize()); IncreasePacketSend(); _sendQueue.PopPacket(); SAFE_DELETE(SendPacket); SendPacket = _sendQueue.PeekPacket(); } } if (_sendBuffer.GetCurSize()) { rc = PostSend(); if (0 != rc) { _IsSending = false; _mutexSend.Unlock(); Disconnect(false); Logger::Log("Session[%X] PostSend Error[%d]\n", this, rc); return 0; } } else { _IsSending = false; } _mutexSend.Unlock(); return 0; }