MFC+Winsock实现基于TCP协议的C/S聊天程序C++
时间: 2024-01-28 18:03:45 浏览: 122
本文将介绍如何使用MFC Winsock库实现基于TCP协议的C/S聊天程序。该程序包括一个服务器端和一个客户端,客户端可以与服务器端进行连接并发送消息,服务器端可以接收客户端发送的消息并将其广播给所有连接的客户端。
1. 创建MFC应用程序
首先,我们需要创建一个MFC应用程序。在Visual Studio中,选择“新建项目”,然后选择“MFC应用程序”。
在“应用程序类型”选项卡中,选择“对话框”,然后在“预定义选项”中选择“使用MFC的Socket”。接下来,按照默认设置完成创建。
2. 添加代码
接下来,我们需要添加一些代码来实现客户端和服务器端的功能。
2.1 服务器端代码
在服务器端,我们需要创建一个监听套接字并等待客户端连接。当客户端连接时,我们需要创建一个新的套接字来与客户端进行通信。我们还需要实现一个函数来处理客户端发送的消息并将其广播给所有连接的客户端。
首先,在服务器的头文件中添加以下代码:
#pragma once
#include "afxsock.h"
#define WM_SOCKET WM_USER+1
class CChatServerDlg : public CDialogEx
{
//...
private:
CSocket m_ServerSocket;
CSocket m_ConnectionSocket;
void ProcessMessage(CString message);
public:
CChatServerDlg(CWnd* pParent = nullptr); // standard constructor
virtual ~CChatServerDlg();
//...
接下来,在服务器的源文件中添加以下代码:
BOOL CChatServerDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// Create server socket
m_ServerSocket.Create(1234);
// Listen for incoming connections
m_ServerSocket.Listen();
// Start accepting connections
m_ServerSocket.Accept(m_ConnectionSocket);
// Enable asynchronous message handling
m_ServerSocket.AsyncSelect(WM_SOCKET, FD_READ | FD_CLOSE);
return TRUE;
}
void CChatServerDlg::OnSocketMessage(WPARAM wParam, LPARAM lParam)
{
if (wParam == m_ServerSocket.m_hSocket)
{
// Accept incoming connection
m_ServerSocket.Accept(m_ConnectionSocket);
// Enable asynchronous message handling
m_ConnectionSocket.AsyncSelect(WM_SOCKET, FD_READ | FD_CLOSE);
}
else if (wParam == m_ConnectionSocket.m_hSocket)
{
// Handle incoming message
char buffer[1024];
int nBytes = m_ConnectionSocket.Receive(buffer, sizeof(buffer));
if (nBytes > 0)
{
// Convert message to CString
buffer[nBytes] = '\0';
CString message(buffer);
// Process message
ProcessMessage(message);
}
else
{
// Close connection
m_ConnectionSocket.Close();
}
}
}
void CChatServerDlg::ProcessMessage(CString message)
{
// Broadcast message to all connected clients
for (int i = 0; i < m_ClientSockets.GetCount(); i++)
{
CSocket* pSocket = m_ClientSockets.GetAt(i);
pSocket->Send(message, message.GetLength());
}
}
2.2 客户端代码
在客户端,我们需要创建一个套接字并连接到服务器。一旦连接成功,我们就可以发送消息给服务器并接收来自服务器的消息。
首先,在客户端的头文件中添加以下代码:
#pragma once
#include "afxsock.h"
#define WM_SOCKET WM_USER+1
class CChatClientDlg : public CDialogEx
{
//...
private:
CSocket m_ClientSocket;
public:
CChatClientDlg(CWnd* pParent = nullptr); // standard constructor
virtual ~CChatClientDlg();
//...
接下来,在客户端的源文件中添加以下代码:
BOOL CChatClientDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// Create client socket
m_ClientSocket.Create();
// Connect to server
m_ClientSocket.Connect(_T("127.0.0.1"), 1234);
// Enable asynchronous message handling
m_ClientSocket.AsyncSelect(WM_SOCKET, FD_READ | FD_CLOSE);
return TRUE;
}
void CChatClientDlg::OnSocketMessage(WPARAM wParam, LPARAM lParam)
{
if (wParam == m_ClientSocket.m_hSocket)
{
// Handle incoming message
char buffer[1024];
int nBytes = m_ClientSocket.Receive(buffer, sizeof(buffer));
if (nBytes > 0)
{
// Convert message to CString
buffer[nBytes] = '\0';
CString message(buffer);
// Display message
m_MessageList.AddString(message);
}
else
{
// Close connection
m_ClientSocket.Close();
}
}
}
void CChatClientDlg::OnBnClickedSendButton()
{
// Get message text
CString message;
m_MessageInput.GetWindowText(message);
// Send message to server
m_ClientSocket.Send(message, message.GetLength());
// Clear message input
m_MessageInput.SetWindowText(_T(""));
}
3. 测试程序
现在,我们可以运行程序并测试它是否可以正常工作。首先启动服务器端,然后启动多个客户端。在客户端中输入一些消息并发送给服务器,然后观察消息是否被广播到所有连接的客户端。
注意:如果您的防火墙阻止程序运行,请确保将其添加到白名单中。
阅读全文