当前位置: 首页 > news >正文

MFC socket编程-服务端和客户端流程

MFC 提供了一套丰富的类库来简化 Windows 应用程序的网络编程。以下是使用 MFC 进行 socket 编程时服务端和客户端的基本流程:

服务端流程:

  1. 初始化 Winsock
    调用 AfxSocketInit 初始化 Winsock 库。

  2. 创建 CSocket 或 CAsyncSocket 对象
    创建一个 socket 对象用于监听连接。

  3. 绑定地址
    使用 Bind 方法将 socket 绑定到一个本地地址和端口。

  4. 监听连接
    调用 Listen 方法开始监听进入的连接请求。

  5. 接受连接
    使用 Accept 方法接受客户端的连接请求,创建一个新的 socket 用于与客户端通信。

  6. 数据交换
    使用 Send 和 Receive 方法与客户端进行数据交换。

  7. 关闭连接
    使用 Close 方法关闭与客户端的连接。

  8. 清理 Winsock
    调用 WSACleanup 清理 Winsock 库。

客户端流程:

  1. 初始化 Winsock
    同服务端。

  2. 创建 CSocket 或 CAsyncSocket 对象
    创建 socket 对象用于发起连接。

  3. 连接到服务端
    使用 Create 方法创建 socket,并使用 Connect 方法连接到服务端。

  4. 数据交换
    使用 Send 和 Receive 方法与服务端进行数据交换。

  5. 关闭连接
    使用 Close 方法关闭连接。

  6. 清理 Winsock
    同服务端。

示例代码:

服务端示例:
// CServerSocket 类
class CServerSocket : public CAsyncSocket
{
public:CServerSocket() {if (!AfxSocketInit())AfxThrowSocketException(WSAEINITIALIZATION_FAILED);}void StartServer(unsigned short nPort) {if (!Bind((SOCKADDR_IN){AF_INET, htons(nPort), INADDR_ANY})) {AfxThrowSocketException(WSAGetLastError());}if (!Listen()) {AfxThrowSocketException(WSAGetLastError());}}CAsyncSocket* Accept() {CAsyncSocket* pSocket = AcceptEx(m_hSocket, NULL, NULL, NULL, NULL, NULL, NULL);if (pSocket) {pSocket->SetSockOpt(SO_UPDATE_ACCEPT_CONTEXT, &m_hSocket, sizeof(m_hSocket));}return pSocket;}
};// 在应用程序中使用
CServerSocket serverSocket;
serverSocket.StartServer(8888);
while (true) {CAsyncSocket* clientSocket = serverSocket.Accept();// 处理客户端连接...
}
客户端示例:
// CClientSocket 类
class CClientSocket : public CAsyncSocket
{
public:CClientSocket() {if (!AfxSocketInit())AfxThrowSocketException(WSAEINITIALIZATION_FAILED);}void ConnectToServer(const CString& strServer, UINT nPort) {SOCKADDR_IN sockAddr = {AF_INET, htons(nPort), inet_addr(strServer)};if (!Create() || SOCKET_ERROR == Connect(sockAddr)) {AfxThrowSocketException(WSAGetLastError());}}
};// 在应用程序中使用
CClientSocket clientSocket;
clientSocket.ConnectToServer("127.0.0.1", 8888);
// 发送和接收数据...
clientSocket.Close();

注意事项:

  • 服务端的 AcceptEx 函数是 Windows 特有的,用于高效地接受大量连接。
  • 客户端示例中使用了 inet_addr 将点分十进制地址转换为网络字节顺序的整数。
  • 错误处理在网络编程中非常重要,示例中省略了详细的错误处理代码。
  • 确保服务器端和客户端的端口号一致,并且服务器端的IP地址正确。

MFC 的网络类库提供了对底层 Winsock API 的封装,使得网络编程变得更加简单和直观。

相关文章:

  • Vue43-单文件组件
  • 22.1 正则表达式-定义正则表达式、正则语法
  • k8s学习--Traffic Shifting 流量接入
  • 【归并排序】| 详解归并排序核心代码之合并两个有序数组 力扣88
  • ubuntu18.04 配置 mid360并测试fast_lio
  • C++ 算法教程
  • 深入理解指针(四)
  • 计算机图形学入门11:图形管线与着色器
  • fs模块(一)
  • Day07-06_13【CT】LeetCode手撕—1. 两数之和
  • Vue主要使用-03
  • mysql之数据聚合
  • 用python纯手写一个日历
  • 数字化校园:打造未来教育新风尚
  • 每天五分钟深度学习框架pytorch:多维tensor向量在某一维度的拼接和分割
  • 深入了解以太坊
  • CAP理论的例子讲解
  • Computed property XXX was assigned to but it has no setter
  • css布局,左右固定中间自适应实现
  • Date型的使用
  • Docker入门(二) - Dockerfile
  • ES6 ...操作符
  • js操作时间(持续更新)
  • JS专题之继承
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 来,膜拜下android roadmap,强大的执行力
  • 前端临床手札——文件上传
  • 前端性能优化--懒加载和预加载
  • 如何实现 font-size 的响应式
  • 实现菜单下拉伸展折叠效果demo
  • 微服务核心架构梳理
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 如何在招聘中考核.NET架构师
  • # 职场生活之道:善于团结
  • #include
  • (1)(1.13) SiK无线电高级配置(六)
  • (1)Hilt的基本概念和使用
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (42)STM32——LCD显示屏实验笔记
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (剑指Offer)面试题34:丑数
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)Sql Server 保留几位小数的两种做法
  • (转)重识new
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • ****三次握手和四次挥手
  • *Django中的Ajax 纯js的书写样式1