#include "stdafx.h" #include #include #include #include #include CSingleSession::CSingleSession( ) : m_hSock( INVALID_SOCKET ), m_lpClientAsync( NULL ), m_pPacketDispatch( NULL ), m_bIsConnected( FALSE ) //m_pRecvBuffer( CREATE_BUFFER( static_cast< unsigned long >( CBufferFactory::GetOptimizedBufferSize( 32768 ) ) ) ) { m_pRecvBuffer = m_DefaultBufferFactory.Create( 32768 ); } CSingleSession::~CSingleSession( ) { Destroy( ); if( m_pRecvBuffer ) { m_DefaultBufferFactory.Release( m_pRecvBuffer ); //RELEASE_BUFFER( m_pRecvBuffer ); } } bool CSingleSession::Initialize( CPacketToolDispatch* pPacketDispatch ) { if( pPacketDispatch == NULL ) return false; m_lpClientAsync = new CClientSock( this ); if( !SetDispatch( pPacketDispatch ) ) { return false; } if( !m_lpClientAsync->Create( ) ) { return false; } return true; } void CSingleSession::Disconnected( ) { MessageBox( NULL, _T("¼­¹ö¿Í ¿¬°áÀÌ ²÷¾îÁ³½À´Ï´Ù."), _T("¾Ë¸²"), MB_OK ); m_bIsConnected = false; } bool CSingleSession::Connect( TCHAR* Address, int nPort ) { if( m_lpClientAsync ) { if( InitializeInternal( m_pPacketDispatch ) ) { if( m_lpClientAsync->Connect(Address, nPort ) ) { m_hSock = m_lpClientAsync->m_hSocket; m_bIsConnected = true; return true; } } } return false; } bool CSingleSession::GetConnected( ) { return m_bIsConnected; } bool CSingleSession::InitializeInternal( CPacketToolDispatch* lpPacketDispatch ) { m_bIsConnected = FALSE; CloseSocket( ); //m_pRecvBuffer->ClearBuffer( ); if( m_pRecvBuffer == NULL ) { return false; } if( m_pPacketDispatch == NULL ) { return false; } return true; } bool CSingleSession::Send( CBuffer* lpBuffer ) { unsigned long dwSendBytes = 0; unsigned long nSendByte = lpBuffer->length( ); if( m_hSock != INVALID_SOCKET ) { while( nSendByte ) { dwSendBytes = m_lpClientAsync->Send( lpBuffer->begin( ), lpBuffer->length( ) ); // ÀüºÎº¸³¾¶§±îÁö ¹öÅß~ if( dwSendBytes ) { nSendByte -= dwSendBytes; } else //¹º°¡ »à½Î¸® { CloseSocket( ); //RELEASE_BUFFER( lpBuffer ); m_DefaultBufferFactory.Release( lpBuffer ); AfxMessageBox( _T("ÆÐŶº¸³»±â ½ÇÆÐ Á¢¼Ó ²÷¾î~~"), MB_OK ); return false; } } } //RELEASE_BUFFER( lpBuffer ); m_DefaultBufferFactory.Release( lpBuffer ); return true; } bool CSingleSession::Recv( ) { unsigned long dwReceived = 0; //¸®½Ø¿¡¿¡¿¡¿¡¿§~ unsigned long dwBufferLength = m_pRecvBuffer->remain( ); //ÇöÁ¦ ¹öÆÛÀÇ ³²Àº°ø°£À» °¡Á®¿ÀÀÚ if( m_hSock != INVALID_SOCKET ) // À¯È¿ÇÑ ¼ÒÄÏ? { dwReceived = m_lpClientAsync->Receive( m_pRecvBuffer->wr_ptr( ), m_pRecvBuffer->remain( ) ); // ÀüºÎ ¹Þ¾Æ¹ö·ÁÁÖÀÚ~ if( dwReceived ) // ¹º°¡ ¹Þ¾Ò´Ù. { return Dispatch( dwReceived ); // ÆÐŶ µð½ºÆÐÄ¡~ ÀÌ } else // Çä~ { CloseSocket( ); } } return false; } bool CSingleSession::Dispatch( unsigned long dwReceivedBytes ) { // ÆÐŶ 󸮸¦ Çϰí, ó¸®ÇÏÁö ¸øÇÑ ¾çÀ» ¾ÕÀ¸·Î °®´Ù ºÙÀδÙ. //m_pRecvBuffer->UseBuffer(dwReceivedBytes); m_pRecvBuffer->wr_ptr( dwReceivedBytes ); unsigned long dwDispatchSize = m_pRecvBuffer->length( ); // ¹ÞÀº ¹ÙÀÌÆ® ¼ö°¡ 0(Á¢¼Ó ¿Ï·á) À̰ųª, ÆÐŶ 󸮿¡ ½ÇÆÐÇϸé SocketÀ» CloseÇÑ´Ù. bool bResult = ( ( 0 != dwReceivedBytes ) && ( NULL != m_pPacketDispatch ) && m_pPacketDispatch->ParsePacket( m_pRecvBuffer->begin( ), &dwDispatchSize ) ); m_pRecvBuffer->rd_ptr( dwDispatchSize ); // ó¸®ÇÑ ÆÐŶ±æÀ̸¸Å­ ¹Ð¾îÁÖ°í m_pRecvBuffer->pop_read_data( ); // ó¸®ÇÑ ÆÐŶÀº ¹öÆÛ¿¡¼­ Áö¿ö¹ö¸®°í... if( !bResult ) { AfxMessageBox( _T("Dispatch ½ÇÆÐ Á¢¼Ó Á¾·á~~"), MB_OK ); CloseSocket(); } return bResult; } void CSingleSession::Close( ) { if( m_lpClientAsync ) delete m_lpClientAsync; m_hSock = INVALID_SOCKET; m_bIsConnected = FALSE; } bool CSingleSession::SetDispatch( CPacketToolDispatch* pPacketDispatch ) { if( m_pPacketDispatch ) return false; m_pPacketDispatch = pPacketDispatch; m_pPacketDispatch->SetSession(this); return true; } void CSingleSession::Destroy( ) { Close( ); CloseSocket( ); if( m_pPacketDispatch ) { m_pPacketDispatch->Destroy(); m_pPacketDispatch = NULL; } // m_pRecvBuffer->ClearBuffer(); } void CSingleSession::CloseSocket( ) { if(INVALID_SOCKET != m_hSock) { shutdown(m_hSock, SD_BOTH); closesocket(m_hSock); } }