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

📄 talklisten.cpp

📁 简单聊天室服务器源码
💻 CPP
字号:
// TalkListen.cpp : implementation file
//

#include "stdafx.h"
#include "TalkS.h"
#include "TalkListen.h"

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


/////////////////////////////////////////////////////////////////////////////
// CTalkListen

CTalkListen::CTalkListen(CWnd *pWnd)
{
	//创建套接字并设置侦听
	m_pHeadConnect=NULL;
	m_nConnectNum=0;
	Create(5710);
	Listen(MAX_NUM+1);
	m_pWnd=pWnd;
}

CTalkListen::~CTalkListen()
{
	//关闭所有存在的连接
	while(m_pHeadConnect) 
	{
		m_pEndConnect=m_pHeadConnect;
		m_pHeadConnect=m_pHeadConnect->m_pNext;
		m_pEndConnect->Close();
		delete m_pEndConnect;
	}
	Close();
	::WSACleanup();
}

// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CTalkListen, CAsyncSocket)
	//{{AFX_MSG_MAP(CTalkListen)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif	// 0

/////////////////////////////////////////////////////////////////////////////
// CTalkListen member functions

void CTalkListen::OnAccept(int nErrorCode) 
{
	// TODO: Add your specialized code here
	if(!m_nConnectNum)	//如果当前连接数为0
	{
		m_pHeadConnect=new CConnect(m_pWnd);	//设置头尾指针
		m_pEndConnect=m_pHeadConnect;
		Accept(*m_pHeadConnect);		
	}
	else if(m_nConnectNum<=MAX_NUM) 
	{
		(m_pEndConnect->m_pNext)=new CConnect(m_pWnd);
		(m_pEndConnect->m_pNext)->m_pPrev=m_pEndConnect;
		m_pEndConnect=m_pEndConnect->m_pNext;
		Accept(*m_pEndConnect);		
	}	
	m_nConnectNum++;
//在接受连接后必须通知用户列表视类,以判断是否接受。
//如果m_nConnectNum>MAX_NUM或重名字,则发送消息并断开连接
//否则
	m_pWnd->SendMessage(WM_NETNEWGUEST,
		m_nConnectNum,(LPARAM)m_pEndConnect);
	CAsyncSocket::OnAccept(nErrorCode);
}

//////////////////////////////////////////////////////////
//删除成员函数,由视调用
void CTalkListen::Delete(CConnect *p)
{
	if(!(p->m_pPrev))
	{
		m_pHeadConnect=m_pHeadConnect->m_pNext;
		if(m_pHeadConnect) m_pHeadConnect->m_pPrev=NULL;
		else m_pEndConnect=NULL;
	}
	else if(!(p->m_pNext))
	{
		m_pEndConnect=m_pEndConnect->m_pPrev;
		if(m_pEndConnect) m_pEndConnect->m_pNext=NULL;
		else m_pHeadConnect=NULL;
	}
	else
	{
		(p->m_pPrev)->m_pNext=p->m_pNext;
		(p->m_pNext)->m_pPrev=p->m_pPrev;
	}
	m_nConnectNum--;
	delete p;
}

CConnect * CTalkListen::FindGuest(CString &str)
{
	CConnect *p=m_pHeadConnect;
	CString strName;
	while(p&&str.Compare(p->GetGuestName()))
		p=p->m_pNext;
	return p;
}

void CTalkListen::TalkPublic(CString &strBuf,DWORD dwLength)
{
	CConnect *p=m_pHeadConnect;
	while(p)
	{
		p->SendData(NET_DATA,dwLength,1,strBuf);
		p=p->m_pNext;
	}
}

void CTalkListen::TalkPrivate(CConnect *pGuest)
{
	CConnect *p=FindGuest(pGuest->GetObjectName());
	pGuest->SendData(NET_DATA,pGuest->GetBufLength(),
		0,pGuest->GetBuf());
	if(p) p->SendData(NET_DATA,pGuest->GetBufLength(),
		0,pGuest->GetBuf());
}

void CTalkListen::NoticeNewGuest(CConnect *pNew)
{
	CConnect *p=m_pHeadConnect;
	while(p)
	{
		if(p!=pNew) p->SendData(NET_GUEST,
			(pNew->GetGuestName()).GetLength()+1,
			1,pNew->GetGuestName());
		p=p->m_pNext;
	}
}

void CTalkListen::NoticeDelGuest(CConnect *pDel)
{
	CConnect *p=m_pHeadConnect;
	while(p)
	{
		if(p!=pDel) p->SendData(NET_DELETE,
			(pDel->GetGuestName()).GetLength()+1,
			1,pDel->GetGuestName());
//		TRACE0(pDel->GetGuestName()+";\n");
		p=p->m_pNext;
	}
}

⌨️ 快捷键说明

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