📄 talklisten.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 + -