亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? chatserverdoc.cpp

?? 基于C/S模式
?? CPP
字號:
// ChatServerDoc.cpp : implementation of the CChatServerDoc class
//

#include "stdafx.h"
#include "ChatServer.h"

#include "ChatServerDoc.h"//添加的代碼
#include "ChatServerView.h"//添加的代碼

#include "Msg.h"//添加的代碼
#include "SetupDlg.h"//添加的代碼

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

/////////////////////////////////////////////////////////////////////////////
// CChatServerDoc

IMPLEMENT_DYNCREATE(CChatServerDoc, CDocument)

BEGIN_MESSAGE_MAP(CChatServerDoc, CDocument)
	//{{AFX_MSG_MAP(CChatServerDoc)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
	ON_UPDATE_COMMAND_UI(ID_STATEMENT_NUM, OnUpdateMessages)//添加的代碼
	ON_UPDATE_COMMAND_UI(ID_PEOPLE_NUM, OnUpdateConnections)//添加的代碼
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CChatServerDoc construction/destruction

CChatServerDoc::CChatServerDoc()
{
	// TODO: add one-time construction code here
	m_pSocket = NULL;
}

CChatServerDoc::~CChatServerDoc()
{
	delete m_pSocket;
}

BOOL CChatServerDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	CSetupDlg Dialog;

	if (Dialog.DoModal() == IDOK)
	{
		m_pSocket=new CListenSocket(this);
		if (m_pSocket->Create(Dialog.m_nPort))
		{
			if (m_pSocket->Listen())
				return TRUE;
		}
	}
	return FALSE;
}



/////////////////////////////////////////////////////////////////////////////
// CChatServerDoc serialization

void CChatServerDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// CEditView contains an edit control which handles all serialization
		((CEditView*)m_viewList.GetHead())->SerializeRaw(ar);
	}
}

/////////////////////////////////////////////////////////////////////////////
// CChatServerDoc diagnostics

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

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

/////////////////////////////////////////////////////////////////////////////
// CChatServerDoc commands

void CChatServerDoc::DeleteContents() 
{
	delete m_pSocket;
	m_pSocket = NULL;          //釋放監聽Socket

	CString temp;
	if (temp.LoadString(IDS_SERVERSHUTDOWN))
		m_msgList.AddTail(temp);  //顯示關閉了的信息于窗口中

	while(!m_connectionList.IsEmpty())
	{
		CClientSocket* pSocket = (CClientSocket*)m_connectionList.RemoveHead();
		CMsg* pMsg = AssembleMsg(pSocket);  //釋放每一個客戶接收Socket    
		pMsg->m_bClose = TRUE;                //同時發送給每一個客戶相應的信息
											  //可以發送信息給客戶,使其進行關閉操作
		SendMsg(pSocket, pMsg);

		if (!pSocket->IsAborted())
		{
			pSocket->ShutDown();

			BYTE Buffer[50];

			while (pSocket->Receive(Buffer,50) > 0);

			delete pSocket;
		}
	}

	m_msgList.RemoveAll();

	if (!m_viewList.IsEmpty())
		((CEditView*)m_viewList.GetHead())->SetWindowText(_T(""));//在窗口上清空

	CDocument::DeleteContents();
}

void CChatServerDoc::UpdateClients()
{
	for(POSITION pos = m_connectionList.GetHeadPosition(); pos != NULL;)
	{
		CClientSocket* pSocket = (CClientSocket*)m_connectionList.GetNext(pos);
		CMsg* pMsg = AssembleMsg(pSocket);

		if (pMsg != NULL)
			SendMsg(pSocket, pMsg);
	}
}

void CChatServerDoc::ProcessPendingAccept()
{
	CClientSocket* pSocket = new CClientSocket(this);

	if (m_pSocket->Accept(*pSocket))
	{
		pSocket->Init();
		m_connectionList.AddTail(pSocket);
	}
	else
		delete pSocket;
}

void CChatServerDoc::ProcessPendingRead(CClientSocket* pSocket)
{
	do
	{
		CMsg* pMsg = ReadMsg(pSocket);

		if (pMsg->m_bClose)
		{
			CloseSocket(pSocket);
			break;
		}
	}
	while (!pSocket->m_pArchiveIn->IsBufferEmpty());

	UpdateClients();
}

CMsg* CChatServerDoc::AssembleMsg(CClientSocket* pSocket)//注意1:這個函數
{													   //的作用是給每個客戶組裝信息結構
	static CMsg msg;								   //從而為了下面的發送	

	msg.Init();

	if (pSocket->m_nMsgCount >= m_msgList.GetCount())//接收前的信息總數應該小于接收
		return NULL;						   //一個或幾個(幾個是由于有多個客戶在發送信息)
											   //新信息之后的信息總數
											   //在這里每個客戶接收Socket的m_nMsgCount
										       //都保存了一個時刻的服務器端的信息總數
	for (POSITION pos1 = m_msgList.FindIndex(pSocket->m_nMsgCount); pos1 != NULL;)
	{
		CString temp = m_msgList.GetNext(pos1);
		msg.m_msgList.AddTail(temp);         //注意:需要理解的是放了哪些串在msg的里面了
	}										//:是比接收前多出的那幾個信息串
	pSocket->m_nMsgCount = m_msgList.GetCount();
	return &msg;
}

CMsg* CChatServerDoc::ReadMsg(CClientSocket* pSocket)
{
	static CMsg msg;

	TRY
	{
		pSocket->ReceiveMsg(&msg);//注意3:接收的是Msg結構,
										//包括了它的三個成員變量
						//而從客戶端的發送函數可以看出,最新的串沒有加入到信息List中。
		Message(msg.m_strText);//所以在這里只是處理這個最新的串,
							   //方式可以從下面的語句看出:把它放到信息List的最后。
		m_msgList.AddTail(msg.m_strText);//注意這個信息List是服務器端應用程序的
	}                                      //的信息List,它包括了所有客戶的信息
	CATCH(CFileException, e)
	{
		CString strTemp;
		if (strTemp.LoadString(IDS_READERROR))
			Message(strTemp);

		msg.m_bClose = TRUE;
		pSocket->Abort();
	}
	END_CATCH

	return &msg;
}

void CChatServerDoc::SendMsg(CClientSocket* pSocket, CMsg* pMsg)
{
	TRY
	{
		pSocket->SendMsg(pMsg);
	}
	CATCH(CFileException, e)
	{
		pSocket->Abort();

		CString strTemp;
		if (strTemp.LoadString(IDS_SENDERROR))
			Message(strTemp);
	}
	END_CATCH
}

void CChatServerDoc::CloseSocket(CClientSocket* pSocket)
{
	pSocket->Close();

	POSITION pos,temp;
	for(pos = m_connectionList.GetHeadPosition(); pos != NULL;)
	{
		temp = pos;
		CClientSocket* pSock = (CClientSocket*)m_connectionList.GetNext(pos);
		if (pSock == pSocket)
		{
			m_connectionList.RemoveAt(temp);
			break;
		}
	}

	delete pSocket;
}

void CChatServerDoc::Message(LPCTSTR lpszMessage)
{
	((CChatServerView*)m_viewList.GetHead())->Message(lpszMessage);
}

/////////////////////////////////////////////////////////////////////////////
// CServerDoc Handlers

void CChatServerDoc::OnUpdateMessages(CCmdUI* pCmdUI)//在狀態欄中顯示有多少的語句已經交流了
{
	pCmdUI->Enable(TRUE);

	CString strFmt;
	if (strFmt.LoadString(ID_STATEMENT_NUM_FORMAT))
	{
		CString strTemp;
		wsprintf(strTemp.GetBuffer(50),strFmt,m_msgList.GetCount());
		strTemp.ReleaseBuffer();
		pCmdUI->SetText(strTemp);
	}
}

void CChatServerDoc::OnUpdateConnections(CCmdUI* pCmdUI)//在狀態欄中顯示有多少人在線
{
	pCmdUI->Enable(TRUE);

	CString strFmt;
	if (strFmt.LoadString(ID_PEOPLE_NUM_FORMAT))
	{
		CString strTemp;
		wsprintf(strTemp.GetBuffer(50),strFmt,m_connectionList.GetCount());
		strTemp.ReleaseBuffer();
		pCmdUI->SetText(strTemp);
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
免费成人小视频| 国产一区二区视频在线播放| 久久精品免视看| 欧美亚洲动漫制服丝袜| 国产盗摄女厕一区二区三区| 亚洲va欧美va国产va天堂影院| 欧美成人激情免费网| 在线观看欧美精品| 粉嫩嫩av羞羞动漫久久久 | 国产喷白浆一区二区三区| 欧美精品日韩一本| 91浏览器在线视频| 成人综合婷婷国产精品久久蜜臀 | 久久综合精品国产一区二区三区| 色噜噜偷拍精品综合在线| 国产传媒欧美日韩成人| 六月丁香综合在线视频| 天天影视网天天综合色在线播放| 日韩毛片一二三区| 欧美激情一区二区三区蜜桃视频| 欧美一区二区在线视频| 欧美日韩一级片在线观看| 99在线精品免费| 国产精品亚洲а∨天堂免在线| 蜜桃av一区二区在线观看| 午夜影院久久久| 一级做a爱片久久| ●精品国产综合乱码久久久久| 久久精品亚洲麻豆av一区二区| 日韩欧美国产一二三区| 欧美酷刑日本凌虐凌虐| 欧美性受极品xxxx喷水| 一本久道中文字幕精品亚洲嫩| jiyouzz国产精品久久| 成人sese在线| 成人一区在线看| 国内精品国产成人国产三级粉色 | 欧美一区午夜视频在线观看| 欧美乱妇一区二区三区不卡视频| 在线亚洲精品福利网址导航| 色婷婷狠狠综合| 色88888久久久久久影院按摩| 99re这里只有精品6| 91麻豆国产香蕉久久精品| 91丝袜美女网| 91成人网在线| 欧美中文一区二区三区| 91精品国产综合久久婷婷香蕉| 欧美群妇大交群中文字幕| 3atv一区二区三区| 欧美xxxxx牲另类人与| 国产午夜精品一区二区三区视频 | 亚洲欧洲av另类| 亚洲精品久久7777| 亚洲电影激情视频网站| 视频一区中文字幕国产| 久久精品国产免费| 国产成人av电影在线观看| 成人福利视频网站| 欧美色视频在线| 精品毛片乱码1区2区3区| 国产午夜精品久久久久久久| 国产精品第一页第二页第三页| 亚洲欧美一区二区三区久本道91| 夜夜爽夜夜爽精品视频| 日韩av网站免费在线| 精品一区二区三区久久久| 国产99久久久国产精品潘金网站| av资源网一区| 7777精品伊人久久久大香线蕉超级流畅 | 亚洲日本电影在线| 日日摸夜夜添夜夜添国产精品| 久久国产综合精品| 91天堂素人约啪| 日韩一级片网址| 国产精品第一页第二页第三页| 午夜精品视频一区| 国产精品系列在线观看| 欧美自拍偷拍午夜视频| 欧美va亚洲va香蕉在线| 亚洲人一二三区| 蜜桃av噜噜一区| 91视频国产观看| 91精选在线观看| 国产精品国产三级国产普通话蜜臀 | 91精品国产免费| 亚洲欧洲av在线| 日韩中文字幕av电影| 成人午夜av在线| 欧美电影在线免费观看| 国产精品白丝在线| 久久9热精品视频| 日本韩国一区二区三区视频| 精品va天堂亚洲国产| 亚洲国产视频网站| 国产成+人+日韩+欧美+亚洲| 欧美精品久久久久久久久老牛影院| www成人在线观看| 亚洲午夜久久久久久久久电影网| 国产一区欧美日韩| 欧美男同性恋视频网站| 亚洲图片欧美激情| 国产精品888| 欧美一区二区三区在线看| 亚洲欧美另类久久久精品2019| 色综合久久中文字幕| 欧美刺激脚交jootjob| 一区二区高清视频在线观看| 丁香天五香天堂综合| 欧美变态tickle挠乳网站| 午夜电影一区二区三区| 欧美在线制服丝袜| 亚洲视频一二区| 懂色av中文一区二区三区| 精品国产伦一区二区三区免费| 天天亚洲美女在线视频| 精品污污网站免费看| 一区二区三区精品视频在线| 99精品视频在线免费观看| 欧美高清在线视频| 国产不卡免费视频| 久久亚洲二区三区| 精品夜夜嗨av一区二区三区| 欧美一级片在线| 日韩精品91亚洲二区在线观看| 91色porny| 成人免费在线播放视频| eeuss鲁片一区二区三区| 国产精品系列在线| 成人午夜免费av| 亚洲欧洲三级电影| 不卡的av网站| 日韩一区欧美一区| 99国产欧美另类久久久精品| 亚洲人精品午夜| 日本大香伊一区二区三区| 亚洲精品亚洲人成人网| 欧美在线|欧美| 亚洲一区二区三区视频在线| 在线日韩国产精品| 亚洲第一二三四区| 欧美一级片免费看| 韩国精品一区二区| 久久久99精品久久| 成人午夜看片网址| 亚洲三级久久久| 在线视频国内自拍亚洲视频| 亚洲电影视频在线| 欧美成人伊人久久综合网| 国产一区二区免费视频| 日本一区二区三区四区在线视频 | 亚洲综合在线观看视频| 欧美日韩在线播放| 日韩av成人高清| 精品国产91久久久久久久妲己 | 五月激情丁香一区二区三区| 欧美一级片在线看| 国产精品亚洲人在线观看| 国产精品国产三级国产| 91视频免费观看| 日韩精品高清不卡| 久久无码av三级| 99久久夜色精品国产网站| 亚洲高清在线视频| 精品欧美一区二区在线观看 | 在线免费不卡视频| 久久精品国产久精国产爱| 国产日产欧美一区| 色av成人天堂桃色av| 日韩精品三区四区| 国产欧美日韩一区二区三区在线观看| 91亚洲精品一区二区乱码| 日韩精品成人一区二区在线| 欧美经典一区二区| 欧美视频完全免费看| 另类专区欧美蜜桃臀第一页| 国产精品黄色在线观看 | 国产精品久久久久国产精品日日 | 伊人色综合久久天天人手人婷| 欧美三级三级三级| 激情综合网激情| 亚洲精品大片www| 日韩精品一区二区三区四区视频 | 久久久精品天堂| 91成人在线观看喷潮| 国产精品一区一区| 亚洲国产一区二区三区青草影视| 精品国产99国产精品| 欧美三级韩国三级日本一级| 国产一区啦啦啦在线观看| 亚洲国产日韩a在线播放性色| 精品国产乱子伦一区| 欧美日韩视频在线一区二区| 国产凹凸在线观看一区二区| 午夜精品久久久久久不卡8050| 日本一区二区三区久久久久久久久不| 欧美性高清videossexo| 成人性视频网站| 麻豆成人91精品二区三区| 亚洲综合区在线|