int Connections::PushPacket(Packet* pPacket) { FUNCTION_BEGIN(); if (false == IsStatus(CONNSTATUS_ACTIVE)) { return 1;//ERR_NET_CONNECTION_STATUS_WRONG } if (false == pPacket->IsValidPacket()) { return 2;//ERR_NET_PACKET_INVALID } _mutexSend.Lock(); if (pPacket->GetPacketLen() > GetMaxSendPacketSize()) { _mutexSend.Unlock(); return 3;//ERR_NET_PACKET_EXCEED_ALLOWED_SIZE } if (_sendBuffer.GetPushAvailableSize() <= pPacket->GetUsedSize()) { if (false == IsSetControlFlag(CONTROL_FLAG_USE_SEND_QUEUE)) { _mutexSend.Unlock(); return 4;//ERR_NET_SESSION_SEND_BUFFER_OVERFLOW } else { Packet * QueuedPacket = new Packet(*pPacket); if (NULL == QueuedPacket) { _mutexSend.Unlock(); return 5;//ERR_SYS_MEMORY_ALLOC_FAIL } if (false == _sendQueue.PushPacket(QueuedPacket)) { SAFE_DELETE(QueuedPacket); _mutexSend.Unlock(); return 6;//ERR_NET_SESSION_SEND_BUFFER_OVERFLOW; } _mutexSend.Unlock(); return 0; } } memcpy(_sendBuffer.GetQueuePushPtr(), pPacket->GetPacketBuffer(), pPacket->GetUsedSize()); Packet sendPacket(_sendBuffer.GetQueuePushPtr()); BYTE Sequence = (BYTE)(_PacketSendCount & PACKET_MAX_SEQUENCE); SetSequence(sendPacket.GetPacketHeader(), Sequence); int rc = 0; if (_PacketEncoder) { rc = _PacketEncoder->TxEncrypt(sendPacket); if (0 != rc) { _mutexSend.Unlock(); return 7;//ERR_NET_PACKET_ENCRYPT_FAIL } } _sendBuffer.IncreasePushPos(pPacket->GetUsedSize()); IncreasePacketSend(); if (false == _IsSending) { rc = PostSend(); if (0 != rc) { _mutexSend.Unlock(); return rc; } _IsSending = true; } _mutexSend.Unlock(); return 0; }
//----------------------------------------------------------------------------------- // Purpose : // Return : //----------------------------------------------------------------------------------- // Called by App TH, Worker TH ( Send ) //----------------------------------------------------------------------------------- int CNtlConnection::PushPacket(CNtlPacket * pPacket) { FUNCTION_BEGIN(); if( false == IsStatus( STATUS_ACTIVE ) ) { return NTL_ERR_NET_CONNECTION_STATUS_WRONG; } if( false == pPacket->IsValidPacket() ) { return NTL_ERR_NET_PACKET_INVALID; } m_mutexSend.Lock(); // ¹ØÀ¸·Î ³»¸®¸é µ¿±âÈ°¡ ±úÁø´Ù [5/30/2008 SGpro] if( pPacket->GetPacketLen() > GetMaxSendPacketSize() ) { m_mutexSend.Unlock(); return NTL_ERR_NET_PACKET_EXCEED_ALLOWED_SIZE; } if( m_sendBuffer.GetPushAvailableSize() <= pPacket->GetUsedSize() ) { if( false == IsSetControlFlag( CONTROL_FLAG_USE_SEND_QUEUE ) ) { m_mutexSend.Unlock(); return NTL_ERR_NET_SESSION_SEND_BUFFER_OVERFLOW; } else { CNtlPacket * pQueuedPacket = new CNtlPacket( *pPacket ); if( NULL == pQueuedPacket ) { m_mutexSend.Unlock(); return NTL_ERR_SYS_MEMORY_ALLOC_FAIL; } if( false == m_sendQueue.PushPacket( pQueuedPacket ) ) { SAFE_DELETE( pQueuedPacket ); m_mutexSend.Unlock(); return NTL_ERR_NET_SESSION_SEND_BUFFER_OVERFLOW; } m_mutexSend.Unlock(); return NTL_SUCCESS; } } //m_mutexSend.Lock(); //¿©±â¿¡ µÎ¸é µ¿±âÈ°¡ ±úÁø´Ù [5/30/2008 SGpro] memcpy( m_sendBuffer.GetQueuePushPtr(), pPacket->GetPacketBuffer(), pPacket->GetUsedSize() ); // [9/10/2007 zeroera] : ¼³¸í : È¿À²¼ºÀ» À§ÇØ ÆÐŶ ¹öÆÛ¿¡ ÀÖ´Â µ¥ÀÌŸ¸¦ °¡Áö°í ¾ÏÈ£È ÇÑ´Ù CNtlPacket sendPacket( m_sendBuffer.GetQueuePushPtr() ); BYTE bySequence = (BYTE) ( m_dwPacketSendCount & PACKET_MAX_SEQUENCE ); SetSequence( sendPacket.GetPacketHeader(), bySequence ); int rc = NTL_SUCCESS; #if __SGPRO_BOTSYSTEM_SENDANDRECVTESTCODE__ #else if( m_pPacketEncoder ) { rc = m_pPacketEncoder->TxEncrypt( sendPacket ); if( NTL_SUCCESS != rc ) { m_mutexSend.Unlock(); return NTL_ERR_NET_PACKET_ENCRYPT_FAIL; } } #endif m_sendBuffer.IncreasePushPos( pPacket->GetUsedSize() ); IncreasePacketSend(); if( false == m_bSending ) { rc = PostSend(); if( NTL_SUCCESS != rc ) { m_mutexSend.Unlock(); return rc; } m_bSending = true; } m_mutexSend.Unlock(); return NTL_SUCCESS; }