181 lines
3.9 KiB
C++
181 lines
3.9 KiB
C++
// ClientSocket.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "HookMsg.h"
|
|
#include "ClientSocket.h"
|
|
#include "..\\Common\\ComData.h"
|
|
#include "HookMsgDlg.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CClientSocket
|
|
|
|
|
|
CClientSocket::CClientSocket(CHookMsgDlg* pMain, CString szSignInName)
|
|
{
|
|
ASSERT(pMain);
|
|
m_pMain = pMain;
|
|
m_szSignInName = szSignInName;
|
|
|
|
Create();
|
|
m_pSocketFile = new CSocketFile(this);
|
|
m_pArchiveIn = new CArchive(m_pSocketFile,CArchive::load);
|
|
m_pArchiveOut = new CArchive(m_pSocketFile,CArchive::store);
|
|
}
|
|
|
|
CClientSocket::~CClientSocket()
|
|
{
|
|
Finalize();
|
|
}
|
|
|
|
void CClientSocket::Finalize()
|
|
{
|
|
if(m_pArchiveIn != NULL){
|
|
delete m_pArchiveIn;
|
|
m_pArchiveIn = NULL;
|
|
}
|
|
if(m_pArchiveOut != NULL){
|
|
delete m_pArchiveOut;
|
|
m_pArchiveOut = NULL;
|
|
}
|
|
if(m_pSocketFile != NULL){
|
|
delete m_pSocketFile;
|
|
m_pSocketFile = NULL;
|
|
}
|
|
|
|
Close();
|
|
}
|
|
|
|
// Do not edit the following lines, which are needed by ClassWizard.
|
|
#if 0
|
|
BEGIN_MESSAGE_MAP(CClientSocket, CSocket)
|
|
//{{AFX_MSG_MAP(CClientSocket)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
#endif // 0
|
|
|
|
void CClientSocket::SendCom(CComData* pComData)
|
|
{
|
|
ASSERT(pComData);
|
|
try {
|
|
if(m_pArchiveOut != NULL) {
|
|
pComData->Serialize(*m_pArchiveOut);
|
|
m_pArchiveOut->Flush();
|
|
}
|
|
}
|
|
catch(CFileException* e) {
|
|
e->Delete();
|
|
m_pArchiveOut->Abort();
|
|
}
|
|
catch(...)
|
|
{
|
|
m_pArchiveOut->Abort();
|
|
}
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CClientSocket member functions
|
|
|
|
void CClientSocket::OnReceive(int nErrorCode)
|
|
{
|
|
CSocket::OnReceive(nErrorCode);
|
|
|
|
ProcessServerCom();
|
|
}
|
|
|
|
|
|
void CClientSocket::ProcessServerCom()
|
|
{
|
|
CComData ComData;
|
|
|
|
try {
|
|
do {
|
|
ComData.Serialize(*m_pArchiveIn);
|
|
}
|
|
while(!m_pArchiveIn->IsBufferEmpty());
|
|
}
|
|
catch(CFileException* e) {
|
|
e->Delete();
|
|
m_pArchiveIn->Abort();
|
|
}
|
|
|
|
if(ComData.m_ComDataType == CComData::COM_SIGN_IN) {
|
|
|
|
try {
|
|
//send the connection confirmation
|
|
CComData ComData;
|
|
ComData.m_ComDataType = CComData::COM_SIGN_IN;
|
|
ComData.m_FromID = m_szSignInName;
|
|
SendCom(&ComData);
|
|
}
|
|
catch(CFileException* e) {
|
|
TCHAR csError[CHAR_BUFFER_SIZE];
|
|
e->GetErrorMessage(csError, CHAR_BUFFER_SIZE);
|
|
AfxMessageBox(csError);
|
|
}
|
|
}
|
|
else if(ComData.m_ComDataType == CComData::COM_SIGN_CHANGE) {
|
|
|
|
m_szSignInName = m_pMain->m_strName = ComData.m_StringBody;
|
|
|
|
m_pMain->AddClientsCom(ComData.m_FromID, " 서버에 접속하였습니다. : " + ComData.m_StringBody );
|
|
m_pMain->UpdateData(FALSE);
|
|
}
|
|
else if(ComData.m_ComDataType == CComData::COM_MESSAGE) {
|
|
|
|
m_pMain->AddClientsCom(ComData.m_FromID, ComData.m_StringBody);
|
|
}
|
|
else if(ComData.m_ComDataType == CComData::COM_CLOSE) {
|
|
|
|
m_pMain->AddClientsCom(ComData.m_FromID, ComData.m_StringBody);
|
|
m_pMain->ClientClosed();
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
void CClientSocket::ClientSignOut()
|
|
{
|
|
try {
|
|
CComData ComData;
|
|
ComData.m_ComDataType = CComData::COM_SIGN_OUT;
|
|
ComData.m_FromID = m_szSignInName;
|
|
ComData.m_StringBody = "접속을 종료합니다.";
|
|
SendCom(&ComData);
|
|
|
|
m_pMain->AddClientsCom(ComData.m_FromID,ComData.m_StringBody);
|
|
}
|
|
catch(CFileException* e){
|
|
TCHAR csError[CHAR_BUFFER_SIZE];
|
|
e->GetErrorMessage(csError, CHAR_BUFFER_SIZE);
|
|
AfxMessageBox(csError);
|
|
}
|
|
}
|
|
|
|
void CClientSocket::SendClientMessage(CString szMessage)
|
|
{
|
|
try {
|
|
CComData ComData;
|
|
ComData.m_ComDataType = CComData::COM_MESSAGE;
|
|
ComData.m_FromID = m_szSignInName;
|
|
ComData.m_StringBody = szMessage;
|
|
|
|
SendCom(&ComData);
|
|
|
|
m_pMain->AddClientsCom(ComData.m_FromID,ComData.m_StringBody);
|
|
}
|
|
catch(CFileException* e){
|
|
TCHAR csError[CHAR_BUFFER_SIZE];
|
|
e->GetErrorMessage(csError, CHAR_BUFFER_SIZE);
|
|
AfxMessageBox(csError);
|
|
}
|
|
}
|
|
|