|
VC++MFC在多字节环境下,SOCKET发送与接收示例源码
在 VC++ MFC 中使用多字节字符集(Multi-Byte Character Set, MBCS)进行 Socket 通信时,您可以使用 `CSocket` 类来实现发送和接收数据的功能。下面是一个简单的示例,展示了如何在多字节环境下使用 Socket 进行数据的发送和接收。
### 示例代码
#### 1. 创建 MFC 应用程序
首先,您需要创建一个 MFC 应用程序项目,并确保选择了多字节字符集。
#### 2. 服务器端代码
在服务器端,您可以使用以下代码来创建一个简单的 Socket 服务器,接受客户端的连接并接收数据。
- // ServerDlg.cpp
- #include "stdafx.h"
- #include "YourApp.h" // 替换为您的应用程序名称
- #include "ServerDlg.h"
- #include <afxsock.h> // 包含 Socket 相关头文件
- // 服务器对话框类
- class CServerDlg : public CDialogEx
- {
- public:
- CServerDlg(CWnd* pParent = nullptr);
- virtual BOOL OnInitDialog();
- void OnBnClickedStart();
- void OnBnClickedStop();
- void AcceptClientConnections();
- DECLARE_MESSAGE_MAP()
- private:
- CSocket serverSocket; // 服务器 Socket
- BOOL isRunning; // 服务器运行状态
- };
- BEGIN_MESSAGE_MAP(CServerDlg, CDialogEx)
- ON_BN_CLICKED(IDC_BUTTON_START, &CServerDlg::OnBnClickedStart)
- ON_BN_CLICKED(IDC_BUTTON_STOP, &CServerDlg::OnBnClickedStop)
- END_MESSAGE_MAP()
- BOOL CServerDlg::OnInitDialog()
- {
- CDialogEx::OnInitDialog();
- return TRUE; // 返回 TRUE,除非将焦点设置到控件
- }
- void CServerDlg::OnBnClickedStart()
- {
- if (!isRunning)
- {
- if (!serverSocket.Create(12345)) // 创建监听端口
- {
- AfxMessageBox("无法创建服务器Socket");
- return;
- }
- serverSocket.Listen(); // 开始监听
- isRunning = TRUE;
- AfxMessageBox("服务器已启动");
- // 创建线程来接受连接
- AfxBeginThread([](LPVOID pParam) -> UINT {
- CServerDlg* pDlg = (CServerDlg*)pParam;
- pDlg->AcceptClientConnections(); // 调用接受连接的函数
- return 0; // 线程结束
- }, (LPVOID)this); // 将对话框指针传递给线程
- }
- }
- void CServerDlg::AcceptClientConnections()
- {
- while (true)
- {
- CSocket* pClientSocket = new CSocket;
- if (serverSocket.Accept(*pClientSocket)) // 接受客户端连接
- {
- // 接收数据
- char buffer[1024];
- int nReceived = pClientSocket->Receive(buffer, sizeof(buffer) - 1); // 接收数据
- if (nReceived > 0)
- {
- buffer[nReceived] = '\0'; // 添加字符串结束符
- CStringA receivedMessage(buffer); // 转换为 CStringA
- CStringA responseMessage = "服务器收到: " + receivedMessage; // 响应消息
- pClientSocket->Send(responseMessage, responseMessage.GetLength()); // 发送响应
- }
- pClientSocket->Close(); // 关闭客户端 Socket
- }
- delete pClientSocket; // 释放内存
- }
- }
- void CServerDlg::OnBnClickedStop()
- {
- if (isRunning)
- {
- serverSocket.Close(); // 关闭服务器 Socket
- isRunning = FALSE;
- AfxMessageBox("服务器已停止");
- }
- }
复制代码
#### 3. 客户端代码
下面是一个简单的客户端示例,连接到服务器并发送数据。
- // ClientDlg.cpp
- #include "stdafx.h"
- #include "YourApp.h" // 替换为您的应用程序名称
- #include "ClientDlg.h"
- #include <afxsock.h> // 包含 Socket 相关头文件
- // 客户端对话框类
- class CClientDlg : public CDialogEx
- {
- public:
- CClientDlg(CWnd* pParent = nullptr);
- virtual BOOL OnInitDialog();
- void OnBnClickedConnect();
- void OnBnClickedSend();
- DECLARE_MESSAGE_MAP()
- private:
- CSocket clientSocket; // 客户端 Socket
- };
- BEGIN_MESSAGE_MAP(CClientDlg, CDialogEx)
- ON_BN_CLICKED(IDC_BUTTON_CONNECT, &CClientDlg::OnBnClickedConnect)
- ON_BN_CLICKED(IDC_BUTTON_SEND, &CClientDlg::OnBnClickedSend)
- END_MESSAGE_MAP()
- BOOL CClientDlg::OnInitDialog()
- {
- CDialogEx::OnInitDialog();
- return TRUE; // 返回 TRUE,除非将焦点设置到控件
- }
- void CClientDlg::OnBnClickedConnect()
- {
- if (clientSocket.Create())
- {
- if (clientSocket.Connect("127.0.0.1", 12345)) // 连接到服务器
- {
- AfxMessageBox("连接成功");
- }
- else
- {
- AfxMessageBox("连接失败");
- }
- }
- }
- void CClientDlg::OnBnClickedSend()
- {
- if (clientSocket.m_hSocket != INVALID_SOCKET)
- {
- CStringA message = "Hello, Server!";
- clientSocket.Send(message, message.GetLength()); // 发送消息
- char buffer[1024];
- int nReceived = clientSocket.Receive(buffer, sizeof(buffer) - 1); // 接收响应
- if (nReceived > 0)
- {
- buffer[nReceived] = '\0'; // 添加字符串结束符
- CStringA responseMessage(buffer); // 转换为 CStringA
- AfxMessageBox(responseMessage); // 显示响应
- }
- }
- }
复制代码
### 代码说明
1. **服务器端**:
- 创建一个 `CSocket` 对象 `serverSocket` ,并在指定端口上监听。
- 使用 `AcceptClientConnections` 函数接受客户端连接并接收数据。
- 接收到的数据通过 `CStringA` 进行处理,并发送响应。
2. **客户端**:
- 创建一个 `CSocket` 对象 `clientSocket` ,并连接到服务器。
- 发送消息并接收服务器的响应。
### 编译和运行
1. 创建一个 MFC 应用程序项目。
2. 将服务器和客户端的代码分别放入相应的对话框类中。
3. 确保在资源文件中添加按钮并设置它们的 ID(例如 `IDC_BUTTON_CONNECT` 和 `IDC_BUTTON_SEND` )。
4. 编译并运行服务器和客户端应用程序。
### 注意事项
- 确保防火墙允许访问指定的端口(在这个例子中是 12345)。
- 先启动服务器,然后启动客户端进行连接和通信。
|
|