如何使用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编程的客户端连接到该服务器,并发送消息。服务器将接收消息并发送一个回复。


数据运维技术 » 如何使用MFC创建Socket服务器 (mfc socket服务器)