📄 clientsocket.cpp
字号:
// ClientSocket.cpp : implementation file
//
#include "stdafx.h"
#include "MyQQServer.h"
#include "ClientSocket.h"
#include "MyQQServerDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CClientSocket
CClientSocket::CClientSocket()
{
}
CClientSocket::~CClientSocket()
{
}
// 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
/////////////////////////////////////////////////////////////////////////////
// CClientSocket member functions
extern CMyQQServerApp theApp;
void CClientSocket::OnReceive(int nErrorCode)
{
CMyQQServerDlg * pWnd = static_cast <CMyQQServerDlg *>(AfxGetMainWnd());
Message m_Message;
memset(&m_Message,0,sizeof(m_Message));
Receive(&m_Message,sizeof(m_Message));
CString strUserName = m_Message.strName;
CString strClientName = m_Message.strClientName;
g_cs.Lock();
if(m_Message.iType == FIRSTLOG)// && msContent.iSubType == FIRSTTIME)
{
CPtrList * m_pClientList = theApp.m_pClientSocketList;
int iCount = m_pClientList->GetCount();
POSITION pos = m_pClientList ->GetHeadPosition();
if(pos)
{
for(int i = 0; i < m_pClientList ->GetCount(); i++)
{
CClientSocket *m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));
if(m_pClientSocket->GetUserName() == strUserName)
{
Message msObj;
memset(&msObj,0,sizeof(Message));
msObj.iType = SYSERROR;
msObj.iSubType = USEREXSIT;
Send(&msObj,sizeof(Message));
return;
}
else
{
Message msObj1;
memset(&msObj1,0,sizeof(Message));
msObj1.iType = USERLOG;
msObj1.iSubType = USERLOGIN;
CString strTemp;
strTemp = m_pClientSocket->GetUserName();
int len = strTemp.GetLength();
lstrcpy(msObj1.strName,strTemp.GetBuffer(len));
msObj1.iImage = m_pClientSocket->GetImage();
Send(&msObj1,sizeof(Message));
}
}
}
iCount = m_pClientList->GetCount();
pos = m_pClientList ->GetHeadPosition();
if(pos)
{
for(int i = 0; i < m_pClientList ->GetCount(); i++)
{
CClientSocket *m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));
m_Message.iType = USERLOG;
m_Message.iSubType = USERLOGIN;
m_pClientSocket->Send(&m_Message,sizeof(Message));
}
}
SetImage(m_Message.iImage);
SetUserName(m_Message.strName);
theApp.m_pClientSocketList->AddTail(this);
CString sList;
sList = m_Message.strName;
pWnd->m_SendNameCtrl.AddString(sList);
sList = sList + " 登陆了";
pWnd->m_ClientList.InsertString(0,sList);
/* Message mssObj;
::ZeroMemory(&mssObj,sizeof(mssObj));
mssObj.iType = USERLOG;
mssObj.iSubType = USERLOGIN;
m_pClientList = theApp.m_pClientSocketList;
pos = m_pClientList ->GetHeadPosition();
iCount = m_pClientList ->GetCount();
if(pos && iCount > 0)
{
CClientSocket * m_pClientSocket;
for(int i = 0; i < iCount; i++)
{
m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));
CString strTemp = m_pClientSocket ->GetUserName();
// CString strTemp = strUserName;
int iLen = strTemp.GetLength();
iLen > 20 ? 20 : iLen;
lstrcpy(mssObj.strName,strTemp.GetBuffer(iLen));
strTemp.ReleaseBuffer();
Send(&mssObj,sizeof(mssObj));
Sleep(100);
}
}
g_cs.Unlock();
SetUserName(m_Message.strName);
*/
}
else
{
if(m_Message.iType == USERSESSION)
{
if(m_Message.iSubType == SAYINPRIVATE)
{
CPtrList * m_pClientList = theApp.m_pClientSocketList;
int iCount = m_pClientList->GetCount();
POSITION pos = m_pClientList ->GetHeadPosition();
if(pos)
{ for(int i = 0; i < m_pClientList ->GetCount(); i++)
{
CClientSocket *m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));
CString strName = m_pClientSocket ->GetUserName();
if(strName == strClientName )
{
m_pClientSocket->Send(&m_Message,sizeof(Message));
CString strOut;
strOut.Format("%d %d %s\n",m_Message.iType,m_Message.iSubType,m_Message.strName);
TRACE0(strOut);
g_cs.Unlock();
return;
}
}
}
}
if(m_Message.iSubType == USERQUIT)
{
g_cs.Lock();
CPtrList * m_pClientList = theApp.m_pClientSocketList;
int iCount = m_pClientList->GetCount();
POSITION pos = m_pClientList ->GetHeadPosition();
POSITION tempos = pos;
if(pos)
{
for(int i = 0; i < m_pClientList ->GetCount(); i++)
{
tempos = pos;
CClientSocket *m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));
if(m_pClientSocket ->GetUserName() == strUserName)
{
m_pClientSocket ->ShutDown();
m_pClientSocket ->Close();
delete m_pClientSocket;
m_pClientList->RemoveAt(tempos);
pWnd->m_ClientList.InsertString(0,strUserName+"退出了");
for(int j=0 ;j<pWnd->m_SendNameCtrl.GetCount();j++)
{
CString strName;
pWnd->m_SendNameCtrl.GetLBText(j,strName);
if(strName == strUserName)
{
pWnd->m_SendNameCtrl.DeleteString(j);
break;
}
}
break;
}
}
}
m_Message.iType = USERLOG;
m_Message.iSubType = USERLOGOUT;
m_pClientList = theApp.m_pClientSocketList;
pos = m_pClientList ->GetHeadPosition();
if(pos)
{
CClientSocket * m_pClientSocket;
for(int i = 0; i < m_pClientList ->GetCount(); i++)
{
m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));
m_pClientSocket ->Send(&m_Message,sizeof(Message));
Sleep(100);
}
}
g_cs.Unlock();
}
}
}
CSocket::OnReceive(nErrorCode);
}
void CClientSocket::SetUserName(CString sName)
{
m_UserName = sName;
}
CString CClientSocket::GetUserName()
{
return m_UserName;
}
void CClientSocket::SetImage(int image)
{
m_image = image;
}
int CClientSocket::GetImage()
{
return m_image;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -