diff --git a/StockServer/ServerSocket.cpp b/StockServer/ServerSocket.cpp new file mode 100644 index 0000000..50ccf06 --- /dev/null +++ b/StockServer/ServerSocket.cpp @@ -0,0 +1,443 @@ + #include "stdafx.h" +#include "StockServer.h" + +#include "ServerSocket.h" +#include "ClientSocket.h" +#include "..\\Common\\ComData.h" + +#include "MainFrm.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + + +///////////////////////////////////////////////////////////////////////////// +// CServerSocket + +CServerSocket::CServerSocket(CMainFrame* pMainFrame) +{ + ASSERT(pMainFrame); + m_pMainFrame = pMainFrame; + m_nMaxClients = -1; +} + +CServerSocket::~CServerSocket() +{ + CloseClients(); + UpdateClientsList(); + Close(); +} + + +// Do not edit the following lines, which are needed by ClassWizard. +#if 0 +BEGIN_MESSAGE_MAP(CServerSocket, CSocket) + //{{AFX_MSG_MAP(CServerSocket) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() +#endif // 0 + +///////////////////////////////////////////////////////////////////////////// +// CListeningSocket member functions + +CPtrList* CServerSocket::GetClientsList() +{ + if (m_ClientstList.IsEmpty()) + return NULL; + + return &m_ClientstList; +} + +int CServerSocket::GetClientsConnectedCount() +{ + return m_ClientstList.GetCount(); +} + +int CServerSocket::GetTotalMessagesCount() +{ + int nMessageCount = 0; + int nCount = m_ClientstList.GetCount(); + for (int i = 0; i < nCount; i++) { + + sClientComInfos* pClientCom = (sClientComInfos*)m_ClientstList.GetAt(m_ClientstList.FindIndex(i)); + ASSERT(pClientCom); + + nMessageCount += pClientCom->szMessagesList.GetCount(); + } + + return nMessageCount; +} + + + +BOOL CServerSocket::BeginListening(UINT uPort, int nMaxClients) +{ + m_nMaxClients = nMaxClients; + + if(!m_ClientstList.IsEmpty()) + CloseClients(); + + if (!Create(uPort)) + return FALSE; + + if (!Listen()) + return FALSE; + + return TRUE; +} + +void CServerSocket::OnAccept(int nErrorCode) +{ + CSocket::OnAccept(nErrorCode); + + ProcessAccept(); +} + +//when got a connection message from a client +void CServerSocket::ProcessAccept() +{ + CClientSocket* pClientSocket = new CClientSocket(this); + ASSERT(pClientSocket); + + if (!Accept(*pClientSocket)) { + delete pClientSocket; + return; + } + pClientSocket->Init(); + + if (m_nMaxClients != -1) { + if (m_nMaxClients <= m_ClientstList.GetCount()) { + try { + //send the connection confirmation to the client,add to the list - yh + CComData ComData; + ComData.m_ComDataType = CComData::COM_CLOSE; + ComData.m_FromID = CString((LPCTSTR)IDS_COM_SERVER); + ComData.m_StringBody = "¼­¹öÀÇ ÃÖ´ëÁ¢¼Ó¼ö¸¦ ³Ñ¾ú½À´Ï´Ù."; + pClientSocket->SendCom(&ComData); + delete pClientSocket; + + m_pMainFrame->AddMessage( ComData.m_FromID, ComData.m_StringBody ); + return; + } + catch(CFileException* e){ + TCHAR csError[CHAR_BUFFER_SIZE]; + e->GetErrorMessage(csError, CHAR_BUFFER_SIZE); + AfxMessageBox(csError); + } + } + } + + try { + //send the connection confirmation to the client,add to the list - yh + CComData ComData; + ComData.m_ComDataType = CComData::COM_SIGN_IN; + ComData.m_FromID = CString((LPCTSTR)IDS_COM_SERVER); + + pClientSocket->SendCom(&ComData); + } + catch(CFileException* e){ + TCHAR csError[CHAR_BUFFER_SIZE]; + e->GetErrorMessage(csError, CHAR_BUFFER_SIZE); + AfxMessageBox(csError); + } + + CString szIPAddress; + UINT uPort; + pClientSocket->GetPeerName(szIPAddress, uPort); + + sClientComInfos* pClientCom = new sClientComInfos; + ASSERT(pClientCom); + + pClientCom->pSocket = (DWORD)pClientSocket; + pClientCom->strID = ""; + pClientCom->szIPAddress = szIPAddress; + pClientCom->uPort = uPort; + pClientCom->TimeStarted = CTime::GetCurrentTime(); + + if(m_ClientstList.IsEmpty()){ + m_ClientstList.AddHead(pClientCom); + } + else{ + m_ClientstList.AddTail(pClientCom); + } +} + + +void CServerSocket::ProcessClientCom(CClientSocket* pClientSocket) +{ + ASSERT(pClientSocket); + + try { + + CComData ComData; + pClientSocket->ReceiveCom(&ComData); + + if(ComData.m_ComDataType == CComData::COM_SIGN_IN) { + + if(IsThisLoginBeingUsed(pClientSocket, &ComData)) { + try { + //send the connection confirmation to the client,add to the list - yh + ComData.Initialize(); + ComData.m_ComDataType = CComData::COM_CLOSE; + ComData.m_FromID = CString((LPCTSTR)IDS_COM_SERVER); + ComData.m_StringBody = "Á¢¼ÓÁ¦ÇÑ ¼ö¸¦ ³Ñ¾ú½À´Ï´Ù."; + pClientSocket->SendCom(&ComData); + } + catch(CFileException* e) { + TCHAR csError[CHAR_BUFFER_SIZE]; + e->GetErrorMessage(csError, CHAR_BUFFER_SIZE); + AfxMessageBox(csError); + } + + RemoveClient(pClientSocket); + return; + } + + SendSignChange( pClientSocket, ComData.m_StringBody ); + + UpdateClientsList(); + + m_pMainFrame->AddMessage(ComData.m_StringBody, "Client Sign in." ); + } + else if(ComData.m_ComDataType == CComData::COM_SIGN_OUT) { + RemoveClient(pClientSocket); + UpdateClientsList(); + m_pMainFrame->AddMessage(ComData.m_FromID, "Client Sign out." ); + } + else if(ComData.m_ComDataType == CComData::COM_MESSAGE) { + + m_pMainFrame->AddMessage(ComData.m_FromID, ComData.m_StringBody ); + UpdateClientsInfo(&ComData, pClientSocket); + } + } + catch(CFileException* e) { + TCHAR csError[CHAR_BUFFER_SIZE]; + e->GetErrorMessage(csError, CHAR_BUFFER_SIZE); + AfxMessageBox(csError); + } +} + +void CServerSocket::SendSignChange(CClientSocket* pClientSocket, CString strNewId) +{ + int nCount = m_ClientstList.GetCount(); + for (int i = 0; i < nCount; i++) { + sClientComInfos* pClientCom = (sClientComInfos*)m_ClientstList.GetAt(m_ClientstList.FindIndex(i)); + ASSERT(pClientCom); + CClientSocket* pClientSocketTmp = (CClientSocket*)pClientCom->pSocket; + ASSERT(pClientSocketTmp); + + if(pClientSocket == pClientSocketTmp) + { + pClientCom->strID = strNewId; // ¼­¹ö¿¡¼­ Ŭ¶óÀÌ¾ðÆ® ¸®½ºÆ®ÀÇ Á¢¼ÓIDÈ®Á¤ÇÔ. + + CComData ComData; + ComData.m_ComDataType = CComData::COM_SIGN_CHANGE; + ComData.m_FromID = CString((LPCTSTR)IDS_COM_SERVER); + ComData.m_StringBody = strNewId; + + pClientSocket->SendCom(&ComData); + return ; + } + } +} + +BOOL CServerSocket::CheckAlive(CClientSocket* pClientSocket, int nCheck) +{ + CComData ComData; + ComData.m_ComDataType = CComData::COM_CHECKALIVE; + ComData.m_FromID = CString((LPCTSTR)IDS_COM_SERVER); + + while( nCheck-- ) + { + if( pClientSocket->SendCom(&ComData) == FALSE ) + { + RemoveClient(pClientSocket); + return FALSE; + } + } + return TRUE; +} + +BOOL CServerSocket::IsThisLoginBeingUsed(CClientSocket* pClientSocket, CComData* pComData) +{ + ASSERT(pClientSocket); + + CString strCheckID = pComData->m_FromID; + + if(strCheckID == CString((LPCTSTR)IDS_COM_SERVER)) + return TRUE; // this name is used by server only! + + if(m_ClientstList.IsEmpty()) return TRUE; + + int nCount = m_ClientstList.GetCount(); + int nCheckCount = 0; + while(nCheckCount++ < 2) { // °°ÀºIDÀϰæ¿ì 2°³±îÁö¸¸ Çã¿ëÇÔ. + + BOOL bStop = TRUE; + + for (int i = 0; i < nCount; i++) { + sClientComInfos* pClientCom = (sClientComInfos*)m_ClientstList.GetAt(m_ClientstList.FindIndex(i)); + ASSERT(pClientCom); + CClientSocket* pClientSocketTmp = (CClientSocket*)pClientCom->pSocket; + ASSERT(pClientSocketTmp); + + if(strCheckID == pClientCom->strID && + pClientSocket != pClientSocketTmp) + { + if( !CheckAlive(pClientSocketTmp) ) + { + pComData->m_StringBody = strCheckID; + return FALSE; + } + + strCheckID.Format("%s(%dth)", pComData->m_FromID, nCheckCount); + bStop = FALSE; + break; + } + } + + if( bStop ) { + pComData->m_StringBody = strCheckID; + return FALSE; + } + } + + return TRUE; +} + +void CServerSocket::UpdateClientsList() +{ + m_pMainFrame->UpdateClientsList(&m_ClientstList); +} + +void CServerSocket::UpdateClientsInfo(CComData* pComData, CClientSocket* pClientSocket) +{ + ASSERT(pComData); + + int nCount = m_ClientstList.GetCount(); + for (int i = 0; i < nCount; i++) { + + sClientComInfos* pClientCom = (sClientComInfos*)m_ClientstList.GetAt(m_ClientstList.FindIndex(i)); + ASSERT(pClientCom); + CClientSocket* pClientSocketTmp = (CClientSocket*)pClientCom->pSocket; + ASSERT(pClientSocketTmp); + + if (pClientSocket == pClientSocketTmp) { + + CString szBuf; + szBuf.Format("%s;%s", GlobalHelper::GetLocalTime(), pComData->m_StringBody); + if (pClientCom->szMessagesList.IsEmpty()) + pClientCom->szMessagesList.AddHead(szBuf); + else + pClientCom->szMessagesList.AddTail(szBuf); + return; + } + } +} + +void CServerSocket::RemoveClient(CClientSocket* pClientSocket) +{ + ASSERT(pClientSocket); + + int nCount = m_ClientstList.GetCount(); + for (int i = 0; i < nCount; i++) { + + sClientComInfos* pClientCom = (sClientComInfos*)m_ClientstList.GetAt(m_ClientstList.FindIndex(i)); + ASSERT(pClientCom); + CClientSocket* pClientSocketTmp = (CClientSocket*)pClientCom->pSocket; + ASSERT(pClientSocketTmp); + + if(pClientSocket == pClientSocketTmp) { + + m_ClientstList.RemoveAt(m_ClientstList.FindIndex(i)); + + pClientSocketTmp->Close(); + delete pClientSocketTmp; + pClientSocketTmp = NULL; + + pClientCom->szMessagesList.RemoveAll(); + delete pClientCom; + pClientCom = NULL; + return; + } + } +} + +void CServerSocket::CloseClients() +{ + int nCount = m_ClientstList.GetCount(); + for (int i = 0; i < nCount; i++) { + + sClientComInfos* pClientCom = (sClientComInfos*)m_ClientstList.GetAt(m_ClientstList.FindIndex(i)); + ASSERT(pClientCom); + CClientSocket* pClientSocketTmp = (CClientSocket*)pClientCom->pSocket; + ASSERT(pClientSocketTmp); + + try { + //send the connection confirmation to the client,add to the list - yh + CComData ComData; + ComData.m_ComDataType = CComData::COM_CLOSE; + ComData.m_FromID = CString((LPCTSTR)IDS_COM_SERVER); + ComData.m_StringBody = "¿¬°áÁ¾·áÇÕ´Ï´Ù."; + + pClientSocketTmp->SendCom(&ComData); + } + catch(CFileException* e) { + TCHAR csError[CHAR_BUFFER_SIZE]; + e->GetErrorMessage(csError, CHAR_BUFFER_SIZE); + AfxMessageBox(csError); + } + + pClientSocketTmp->Close(); + delete pClientSocketTmp; + pClientSocketTmp = NULL; + + m_pMainFrame->AddMessage(pClientCom->strID, "¿¬°áÁ¾·áÇÕ´Ï´Ù."); + + pClientCom->szMessagesList.RemoveAll(); + delete pClientCom; + pClientCom = NULL; + } + + m_ClientstList.RemoveAll(); +} + +void CServerSocket::SendMessageTo(CString szClient, CString szMessage) +{ +/* int nCount = m_ClientstList.GetCount(); + for (int i = 0; i < nCount; i++) { + + sClientComInfos* pClientCom = (sClientComInfos*)m_ClientstList.GetAt(m_ClientstList.FindIndex(i)); + ASSERT(pClientCom); + CComData* pComDataTmp = (CComData*)&pClientCom->ComData; + ASSERT(pComDataTmp); + CClientSocket* pClientSocketTmp = (CClientSocket*)pComDataTmp->pSocket; + ASSERT(pClientSocketTmp); + + if (pComDataTmp->szFrom == szClient) { + + try { + //send the connection confirmation to the client,add to the list - yh + CComData ComDataTmp; + ComDataTmp.szFrom = CString((LPCTSTR)IDS_COM_SERVER); + ComDataTmp.uSignIcon = SERVER_ICON; + ComDataTmp.szMessage = szMessage; + ComDataTmp.uMessage = CComData::COM_PRIVATE_MESSAGE; + pClientSocketTmp->SendCom(&ComDataTmp); + } + catch(CFileException* e) { + TCHAR csError[CHAR_BUFFER_SIZE]; + e->GetErrorMessage(csError, CHAR_BUFFER_SIZE); + AfxMessageBox(csError); + } + + return; + } + } +*/ +} + +