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

📄 clientsocket.cpp

📁 基于UDP协议的winsock聊天室
💻 CPP
字号:
// ClientSocket.cpp : implementation file
//

#include "stdafx.h"
#include "Server.h"
#include "ClientSocket.h"
#include "ServerDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CClientSocket

CClientSocket::CClientSocket()
{
	m_nCurrentTask = 0;
	m_strNickname = _T("");
}

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

void CClientSocket::OnClose(int nErrorCode) 
{
	// TODO: Add your specialized code here and/or call the base class
	CServerDlg *pServerDlg = (CServerDlg *)((CServerApp *)AfxGetApp()->m_pMainWnd);
	CListBox *pListBox = (CListBox *)pServerDlg->GetDlgItem(IDC_MEMBERLIST);
	pListBox->DeleteString(pListBox->FindString(0, m_strNickname));
	CRichEditCtrl *pRichEdit = (CRichEditCtrl *)pServerDlg->GetDlgItem(IDC_MESSAGEDISP);
	CString str;
	pRichEdit->GetWindowText(str);
	str += "\r\n***** " + m_strNickname + " 离开了聊天室 *****";
	pRichEdit->SetWindowText(str);
	pServerDlg->OnClose(this);

	CRichEditCtrl *pRich = ((CRichEditCtrl *)pServerDlg->GetDlgItem(IDC_MESSAGEDISP));
	
	if(pRich->GetLineCount() > 14)
	{
		pRich->LineScroll(1, 0);
		pRich->LineScroll(1, 0);
	}
	CSocket::OnClose(nErrorCode);
}

void CClientSocket::OnReceive(int nErrorCode) 
{
	// TODO: Add your specialized code here and/or call the base class
	CServerDlg *pServerDlg = (CServerDlg *)((CServerApp *)AfxGetApp()->m_pMainWnd);
	char szMessage[8192];
	CListBox *pListBox = NULL;
	CRichEditCtrl *pRichEdit = NULL;
	CString str, strMessage, PeerAddress;
	CClientSocket *pClientSocket = NULL;
	int i=0, j=0;

	switch(m_nCurrentTask)
	{
	case 0:
		memset(szMessage, 0, 8192);
		Receive(szMessage, 8192);
		strMessage.Format("%s", szMessage);
		m_strNickname = strMessage.Mid(strMessage.Find('/')+1);
		strMessage.Delete(strMessage.Find('/'), strMessage.GetLength()-strMessage.Find('/'));
		m_nUDPPort = atoi(strMessage);
		pListBox = (CListBox *)pServerDlg->GetDlgItem(IDC_MEMBERLIST);
		pListBox->AddString(m_strNickname);
		pRichEdit = (CRichEditCtrl *)pServerDlg->GetDlgItem(IDC_MESSAGEDISP);
		pRichEdit->GetWindowText(str);
		str += "\r\n***** 欢迎 " + m_strNickname + " 进入聊天室! *****";
		pRichEdit->SetWindowText(str);
		m_nCurrentTask = 1;

		GetPeerName(m_strPeerAddress, m_nPeerPort);

		str.Format("%d", m_nUDPPort);
		str = "Add" + m_strPeerAddress + "/" + str + "/" + m_strNickname;	
		for(i=0; i<pServerDlg->m_ClientList.GetCount(); i++)//在每个用户端增加新加入的用户
		{
			pClientSocket = pServerDlg->m_ClientList.GetAt(pServerDlg->m_ClientList.FindIndex(i));
			pClientSocket->Send(str, str.GetLength());
			Sleep(100);
		}

		for(i=0; i<pServerDlg->m_ClientList.GetCount(); i++)//给新加入的用户建立用户列表
		{
			pClientSocket = pServerDlg->m_ClientList.GetAt(pServerDlg->m_ClientList.FindIndex(i));
			str.Format("%d", pClientSocket->m_nUDPPort);
			str = "Add" + pClientSocket->m_strPeerAddress + "/" + str + "/" + pClientSocket->m_strNickname;				
			Send(str, str.GetLength());
			Sleep(100);
//			pServerDlg->MessageBox(str, pClientSocket->m_strNickname);
		}	//"Add136.0.0.1/5736/ffyt";
		break;
	case 1:
		memset(szMessage, 0, 8192);
		ReceiveFrom(szMessage, 8192, PeerAddress, m_nUDPPort);
		pServerDlg->GetDlgItemText(IDC_MESSAGEDISP, str);
		str += "\r\n";
		str += m_strNickname + ": ";
		str += szMessage;
		pServerDlg->SetDlgItemText(IDC_MESSAGEDISP, str);
		break;
	}
//	str="";
	CRichEditCtrl *pRich = ((CRichEditCtrl *)pServerDlg->GetDlgItem(IDC_MESSAGEDISP));
	
	if(pRich->GetLineCount() > 14)
	{
		pRich->LineScroll(1, 0);
		pRich->LineScroll(1, 0);
	}
	CSocket::OnReceive(nErrorCode);
}

⌨️ 快捷键说明

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