⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mychatsvrdoc.cpp

📁 关于使用VC编程的代码
💻 CPP
字号:
// MyChatSvrDoc.cpp : implementation of the CMyChatSvrDoc class
//

#include "stdafx.h"
#include "MyChatSvr.h"
#include "MainFrm.h"
#include "OutputView.h"
#include "ChannelDlg.h"

#include "MyChatSvrDoc.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyChatSvrDoc

IMPLEMENT_DYNCREATE(CMyChatSvrDoc, CDocument)

BEGIN_MESSAGE_MAP(CMyChatSvrDoc, CDocument)
	//{{AFX_MSG_MAP(CMyChatSvrDoc)
	ON_UPDATE_COMMAND_UI(ID_FILE_SAVE, OnUpdateFileSave)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyChatSvrDoc construction/destruction

CMyChatSvrDoc::CMyChatSvrDoc()
{
	m_strClientClosed.LoadString(IDS_CLIENT_CLOSED);
	m_bContentModified = FALSE;
}

CMyChatSvrDoc::~CMyChatSvrDoc()
{
	if(m_pListenSocket != NULL)
	{
		m_pListenSocket->Close();
		delete m_pListenSocket;
		m_pListenSocket = NULL;
	}

	POSITION pos;
	CClientSocket* pSocket;
	for(pos=m_pClientList.GetHeadPosition();pos!=NULL;)
	{
		pSocket = (CClientSocket *)m_pClientList.GetNext(pos);
		delete pSocket;
	}
}

BOOL CMyChatSvrDoc::OnNewDocument()
{
///	AfxMessageBox("enter sever->CMyChatSvrDoc::OnNewDocument");
	
	CChannelDlg dlg;
	if(dlg.DoModal() == IDOK)
	{
		m_pListenSocket = new CListeningSocket(this);
		m_pListenSocket->Create(dlg.m_nPort+700);
		m_pListenSocket->Listen();
	}
	else
	{
		AfxMessageBox("error in create chat svr!");
	}
	

	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)

	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CMyChatSvrDoc serialization

void CMyChatSvrDoc::Serialize(CArchive& ar)
{
	CMainFrame* pFrm = (CMainFrame*)AfxGetApp()->m_pMainWnd;
	COutputView* pView = (COutputView*)pFrm->m_wndSplitter.GetPane(0,0);
	CString strMsg;

	if (ar.IsStoring())
	{
		pView->GetWindowText(strMsg);
		ar << strMsg;
		m_bContentModified = FALSE;
	}
	else
	{
		ar >> strMsg;
		pView->MsgOut(strMsg);
	}
}

/////////////////////////////////////////////////////////////////////////////
// CMyChatSvrDoc diagnostics

#ifdef _DEBUG
void CMyChatSvrDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CMyChatSvrDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMyChatSvrDoc commands

void CMyChatSvrDoc::DeleteContents() 
{

	CDocument::DeleteContents();
}

void CMyChatSvrDoc::ProcessReceive(CClientSocket* pSocket)
{
	CMainFrame* pFrm = (CMainFrame*)AfxGetApp()->m_pMainWnd;
	COutputView* pView = (COutputView*)pFrm->m_wndSplitter.GetPane(0,0);
	CString strRecv;
	strRecv = pSocket->ReadData();
	pView->MsgOut(strRecv);
	
	if(strRecv == m_strClientClosed)
	{
		CloseSocket(pSocket);
		delete pSocket;
	}
	else
	{
		BroadcastMsg(pSocket,strRecv);
	}
}

void CMyChatSvrDoc::ProcessAccept()
{
	CClientSocket *pSocket = new CClientSocket(this);
	
	if(m_pListenSocket->Accept(*pSocket))
	{
		pSocket->Init();
		m_pClientList.AddTail((void *) pSocket);
//		AfxMessageBox("enter CMyChatSvrDoc::ProcessAccept()");
	}
	else
	{
		delete pSocket;
	}
	
}

void CMyChatSvrDoc::CloseSocket(CClientSocket *pSocket)
{
	CClientSocket *pSavedSocket;
	POSITION pos,posOld;
	BOOL bFind; 

	pSocket->Finish_Comm();
	pos = m_pClientList.GetHeadPosition();
	bFind = FALSE;
	while((pos != NULL) && (bFind == FALSE))
	{
		posOld = pos;
		pSavedSocket = (CClientSocket *)m_pClientList.GetNext(pos);
		bFind = (pSocket == pSavedSocket);
	}
	if(bFind == TRUE)
	{
		m_pClientList.RemoveAt(posOld);
	}
}

void CMyChatSvrDoc::OnCloseDocument() 
{
	CString strClosed;
	strClosed.LoadString(IDS_SERVER_CLOSED);

	BroadcastMsg(NULL, strClosed);
	CDocument::OnCloseDocument();
}

// the strMsg comes from the *pSocket,broadcasting such message to all the
// client connected to the server
// if the message comes from the server,then set the parameter of pSocket is set to NULL
void CMyChatSvrDoc::BroadcastMsg(CClientSocket* pSocketSource, CString strMsg)
{
	POSITION pos;
	CClientSocket* pOtherSocket;

	for(pos=m_pClientList.GetHeadPosition();pos!=NULL;)
	{
		pOtherSocket = (CClientSocket *)m_pClientList.GetNext(pos);
		if(pOtherSocket != pSocketSource)
		{
			pOtherSocket->SendData(strMsg);
		}
	}
}

void CMyChatSvrDoc::OnUpdateFileSave(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_bContentModified == TRUE);			
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -