#include "FimngdSocketControl.h" #include "Logger.h" #include // Packet Header stx ÄÚµå #define HEADER_STX_CODE 0x02 // Packet Header type ±¸ºÐÄÚµå #define HEADER_TYPE_REQUEST 0x00 // Packet command : fimngd ¿äû ( Command 3th Byte ¸¸ »ç¿ë ) #define REQUEST_CACHE_CREATE 0x01 // »ý¼ºÀÚ. // param [IN] clientSocket client ¿Í Åë½Å ¿¬°áµÈ socket. CFimngdSocketControl::CFimngdSocketControl( int clientSocket ) : CBaseSocket( clientSocket ) , m_nPacketHeaderLen ( sizeof(m_packetHeader)) , m_nPacketDataLen( 0 ) { } // ¼Ò¸êÀÚ. CFimngdSocketControl::~CFimngdSocketControl() { // ¼Ò¸êÀÚ Socket ¸í½ÃÀû Close ó¸®. Close(); } // ¼ö½ÅµÈ Data ¸¦ Àü´Þ¹ÞÀº ÀÎÀÚ¿¡ ¼³Á¤ÇÏ¿© ¹Ýȯ ó¸® // @param [OUT] data ¼ö½ÅµÈ Data ¸¦ ÀúÀåÇÒ °´Ã¼¿¡ ´ëÇÑ ÂüÁ¶ // @param [in] timeout ´ë±â timeout (sec) // @return -1 : Socket ¿À·ù ¶Ç´Â À߸øµÈ Data ¼ö½Å½Ã // 0 : timeout ¹ß»ý½Ã // 1 : Á¤»ó int CFimngdSocketControl::GetData( CCacheRequestData & data, int timeout ) { // Header Á¤º¸¸¦ ¼ö½Å int nResult = GetPacketHeader( timeout ); if( nResult == -1 ) { // Socket ²÷±è ¶Ç´Â Á¤ÀǵÇÁö ¾ÊÀº Data ¼ö½Å½Ã. return -1; } else if( nResult == 0 ) { // timeout ¹ß»ý½Ã return 0; } // Header Data Á¤»ó ¼ö½Å½Ã... command code ¿¡ µû¸¥ ó¸®. if( m_packetHeader.command[2] == REQUEST_CACHE_CREATE ) { // Cache »ý¼º ¿äûÀÎ °æ¿ì... // Body ºÎºÐÀÌ °íÁ¤ Packet Çü½ÄÀ̹ǷÎ.... // - ¼ö½ÅµÈ data_length ¿Í À̸¦ ÀúÀåÇÒ ±¸Á¶Ã¼ÀÇ Å©±â°¡ µ¿ÀÏÇÑÁö È®ÀÎ // - ¸¸¾à µ¿ÀÏÇÏÁö ¾ÊÀº °æ¿ì.. packet ¿À·ù·Î ó¸® if( m_nPacketDataLen != sizeof( struct stCacheRequestBody ) ) { LOG( LERR, "Cache request packet body size not valid.[%u]/[%lu]" , m_nPacketDataLen, sizeof( struct stCacheRequestBody ) ); return -1; } // Data ºÎºÐ ¼ö½Å ó¸®. if( GetBodyCacheRequest( data ) == false ) { // body ¼ö½Å 󸮽à ¿À·ù ¹ß»ý return -1; } return 1; } else { // ¹ÌÁ¤ÀÇµÈ command code ÀÎ °æ¿ì( ÇöÀç 1°³ type ¸¸ Á¤ÀǵǾî ÀÖÀ¸¹Ç·Î. ) LOG( LERR, "Not defined command code." ); PrintHeaderToLog(); return -1; } } // Packet Header Á¤º¸¸¦ Log ÆÄÀÏ¿¡ Logging ó¸® ( Debug 󸮸¦ À§ÇÑ ÇÔ¼ö) void CFimngdSocketControl::PrintHeaderToLog() { _LOG( LINF, "------------------------------------" ); _LOG( LINF, "stx [%02x]", m_packetHeader.stx ); _LOG( LINF, "type [%02x]", m_packetHeader.type ); _LOG( LINF, "command [%02x][%02x][%02x][%02x]" , m_packetHeader.command[0], m_packetHeader.command[1] , m_packetHeader.command[2], m_packetHeader.command[3] ); _LOG( LINF, "result [%02x][%02x][%02x][%02x]" , m_packetHeader.result[0], m_packetHeader.result[1] , m_packetHeader.result[2], m_packetHeader.result[3] ); _LOG( LINF, "data_length [%u]", m_nPacketDataLen ); _LOG( LINF, "extend_code [%02x][%02x]", m_packetHeader.extend_code[0], m_packetHeader.extend_code[1] ); _LOG( LINF, "------------------------------------" ); } // Packet Header ºÎºÐÀÇ ¼ö½Å 󸮸¦ À§ÇÑ ÇÔ¼ö // @param timeout [in] ´ë±â½Ã°£. // @retrun 0 : timeout // 1 : ¼º°ø // -1 : socket ¿À·ù ¶Ç´Â Á¤ÀÇµÈ Data °¡ ¾Æ´Ñ °æ¿ì. int CFimngdSocketControl::GetPacketHeader( int timeout ) { if( IsValidSocket() == false ) return -1; // Socket À¸·Î ºÎÅÍ Packet Header ºÎºÐ ¼ö½Å. // ¼ö½ÅµÈ Á¤º¸´Â ¸â¹öº¯¼ö¿¡ ÀúÀåó¸®. /// read µÈ µ¥ÀÌÅÍÀÇ Å©±â. 0: fd closed, -1: ¿À·ù, -2: Timeout int nRead = ReadNTimeout( &m_packetHeader, m_nPacketHeaderLen, timeout ); if( nRead == -2 ) { // timeout ¹ß»ý½Ã return 0; } else if( nRead <= 0 ) { // timeout À» Á¦¿ÜÇÑ ±× ¹ÛÀÇ ¿À·ù ¹ß»ý½Ã return -1; } else { // Á¤»ó Data ¼ö½Å½Ã. // STX code °Ë»ç. if( m_packetHeader.stx != HEADER_STX_CODE ) { LOG( LERR, "Not valid stx code." ); PrintHeaderToLog(); return -1; } // Type Code °Ë»ç if( m_packetHeader.type != HEADER_TYPE_REQUEST ) { LOG( LERR, "Not valid type code." ); PrintHeaderToLog(); return -1; } // Data Length ºÎºÐ °ªÀ» ¸â¹ö º¯¼ö¿¡ ÀúÀåó¸®. m_nPacketDataLen = ntohl( m_packetHeader.data_length ); return 1; } } // FHS ÀÇ Hot Content Cache »ý¼º ¿äû Packet Body ºÎºÐÀ» ¼ö½Å ó¸® bool CFimngdSocketControl::GetBodyCacheRequest( CCacheRequestData & data ) { // ¼ö½ÅµÈ Body ¸¦ ÀúÀåÇÒ º¯¼ö »ý¼º. struct stCacheRequestBody stBody; // Body ºÎºÐ ¼ö½Å ó¸®. int nRead = ReadNTimeout( &stBody, m_nPacketDataLen, 15 ); if( nRead == -2 ) { // timeout ¹ß»ý½Ã // - ÁöÁ¤µÈ ½Ã°£ µ¿¾È Header ¿¡ ±â·ÏµÈ Body Å©±â¸¦ ÀÐÁö ¸øÇßÀ¸¹Ç·Î. ¿À·ù·Î ó¸® LOG( LERR, "cache request body[%lu] read timeout.", sizeof( struct stCacheRequestBody ) ); return false; } else if( nRead <= 0 ) { // timeout À» Á¦¿ÜÇÑ ±× ¹ÛÀÇ ¿À·ù ¹ß»ý½Ã LOG( LERR, "cache request body read error[%d]", nRead ); return false; } else { // Body ºÎºÐ Á¤»ó ¼ö½Å½Ã... // - ¼ö½ÅµÈ Data ¸¦ ÆÄ½ÌÇÏ¿©.... // - ÀÎÀÚ·Î Àü´Þ¹ÞÀº data °´Ã¼¿¡ ÀúÀå ó¸®. data.Set( &stBody ); return true; } }