如何使用MFC创建Socket服务器 (mfc socket服务器)
Socket是一种机制,允许不同的计算机之间进行通信,实现网络编程。MFC是一种Microsoft提供的框架,可以帮助程序员快速地开发Windows图形用户界面。本文将介绍。
1. 创建一个MFC应用程序
我们需要创建一个MFC应用程序。打开Visual Studio,选择“文件”->“新建”->“项目”,选择“MFC应用程序”模板,并输入应用程序名称。在下一步中,选择“单文档”应用程序。完成后,你应该看到一个空的MFC框架应用程序。
2. 导入Socket库
MFC框架中已经包含了大量的类和函数,但并没有直接支持Socket编程的库。因此,我们需要手动导入Socket库。
右键单击项目名称,在弹出的菜单中选择“属性”。在属性窗口中,展开“配置属性”->“C/C++”->“常规”,找到“附加包含目录”一栏,并添加以下路径:
C:\Program Files (x86)\Microsoft Visual Studio\2023\Community\VC\Tools\MSVC\14.27.29110\include
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um
接下来,展开“配置属性”->“链接器”->“常规”,找到“附加库目录”一栏,并添加以下路径:
C:\Program Files (x86)\Microsoft Visual Studio\2023\Community\VC\Tools\MSVC\14.27.29110\lib\x86
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x86
在“配置属性”->“链接器”->“输入”中,添加以下库文件:
ws2_32.lib
3. 创建Socket服务器
接下来,我们可以开始创建Socket服务器。在MFC应用程序的主框架类中添加以下代码:
// MyServerDlg.h文件
#pragma once
#include
class CMyServerDlg : public CDialogEx
{
public:
CMyServerDlg(CWnd* pParent = nullptr); // 标准构造函数
virtual ~CMyServerDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_MYSERVER_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnPnt();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
private:
CMySocket m_listenSocket; // 监听socket
CMySocket m_clientSocket; // 客户端socket
void OnAccept(); // 接收连接请求
void OnReceive(); // 接收客户端消息
};
// MyServerDlg.cpp文件
#include “MyServerDlg.h”
#include “afxdialogex.h”
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CMyServerDlg::CMyServerDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_MYSERVER_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MNFRAME);
}
CMyServerDlg::~CMyServerDlg()
{
}
void CMyServerDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CMyServerDlg, CDialogEx)
ON_WM_PNT()
ON_WM_QUERYDRAGICON()
// 添加以下两个消息映射函数
ON_NOTIFY(NS_ACCEPT, IDC_LISTEN_SOCKET, &CMyServerDlg::OnAccept)
ON_NOTIFY(NS_RECEIVE, IDC_CLIENT_SOCKET, &CMyServerDlg::OnReceive)
END_MESSAGE_MAP()
BOOL CMyServerDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
…
// 初始化监听socket
m_listenSocket.Create(8888);
m_listenSocket.Listen();
return TRUE;
}
void CMyServerDlg::OnPnt()
{
if (IsIconic())
{
…
}
else
{
…
}
}
HCURSOR CMyServerDlg::OnQueryDragIcon()
{
…
}
void CMyServerDlg::OnAccept()
{
// 接收连接请求
m_listenSocket.Accept(m_clientSocket);
// 显示客户端ip地址
CString ipAddress;
UINT port;
m_clientSocket.GetPeerName(ipAddress, port);
TRACE(“New connection from %s:%d.\n”, ipAddress, port);
// 为客户端socket设置代理
m_clientSocket.EnableMessages();
m_clientSocket.AsyncSelect(FD_READ);
}
void CMyServerDlg::OnReceive()
{
// 接收客户端消息
char buffer[1024];
int rc = m_clientSocket.Receive(buffer, sizeof(buffer));
if (rc > 0)
{
buffer[rc] = ‘\0’;
TRACE(“Received message: %s\n”, buffer);
// 发送消息回复
CString response;
response.Format(“Response to %s:%d is received: %s”, ipAddress, port, buffer);
m_clientSocket.Send((LPCVOID)(LPCTSTR)response, response.GetLength() + 1);
}
else if (rc == 0)
{
// 客户端关闭连接
m_clientSocket.Close();
}
}
以上代码创建了一个Socket服务器,监听端口为8888。当客户端连接成功后,服务器将接收客户端发送的消息,并发送消息回复。
注意,代码中使用了MFC框架中提供的CMySocket类,它是基于Windows Socket API的封装,提供了简单的Socket编程接口。
4. 运行Socket服务器
我们将创建的Socket服务器运行起来。点击Visual Studio的“运行”按钮,在运行窗口中看到服务器开始监听端口8888。现在,你可以使用任何支持Socket编程的客户端连接到该服务器,并发送消息。服务器将接收消息并发送一个回复。