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

C++ SOCKET编程:同步阻塞与异步非阻塞通信服务端和客户端代码,支持多连接、断线重连及详...

1、C++SOCKET同步阻塞、异步非阻塞通信服务端、客户端代码,支持多个客户端连接。 2、断线重连(服务端或客户端没有启动顺序要求,先开启的等待另一端连接); 3、服务端支持同时连接多个客户端; 4、阅读代码就明白通信道理,注释详细; 5、VS2015编译通过。

概述

本文介绍了一个基于MFC框架的异步TCP通信程序,包含服务端和客户端两个独立应用程序。该程序采用Windows Socket API的异步非阻塞模式,能够处理多个客户端同时连接,实现了基本的聊天室功能。服务端可以接受多个客户端连接,并将任一客户端发送的消息广播给所有已连接的客户端。

系统架构

技术特点

  • 异步非阻塞通信:使用WSAAsyncSelect实现基于Windows消息机制的异步Socket通信
  • 多客户端支持:服务端使用链表结构管理所有客户端连接信息
  • Unicode/ANSI编码转换:完整处理不同字符编码的转换
  • MFC对话框界面:提供友好的用户交互界面

客户端功能详解

核心功能

客户端程序主要实现以下功能:

  1. 网络初始化:初始化Winsock库,创建TCP套接字
  2. 服务器连接:支持指定服务器IP地址和端口号进行连接
  3. 异步消息处理:通过Windows消息机制处理网络事件
  4. 消息收发:支持向服务器发送消息并接收来自服务器的消息
  5. 编码转换:在Unicode和ANSI编码之间进行转换

关键实现

客户端使用WSAAsyncSelect函数将Socket事件与窗口消息绑定:

WSAAsyncSelect(m_Socket, m_hWnd, NETWORK_RECEIVE, FD_CLOSE | FD_READ | FD_WRITE)

当有网络事件发生时,系统会发送NETWORK_RECEIVE消息到窗口过程,然后在OnNetworkReceive方法中处理具体事件。

1、C++SOCKET同步阻塞、异步非阻塞通信服务端、客户端代码,支持多个客户端连接。 2、断线重连(服务端或客户端没有启动顺序要求,先开启的等待另一端连接); 3、服务端支持同时连接多个客户端; 4、阅读代码就明白通信道理,注释详细; 5、VS2015编译通过。

消息接收处理流程:

BOOL CAsyncSocketClientDlg::onreceive() { char * buff = new char[1024]; // 接收服务器数据 recv(m_Socket, buff, 1024, 0); // 转换为Unicode并显示在界面上 this->edit_values += AnsiToUnicode(buff); SetDlgItemText(IDC_EDIT1, this->edit_values); }

服务端功能详解

核心功能

服务端程序具备更复杂的功能:

  1. 服务监听:在指定端口启动TCP监听服务
  2. 客户端管理:使用链表结构维护所有连接的客户端信息
  3. 连接接受:异步接受新的客户端连接请求
  4. 消息广播:将任一客户端发送的消息转发给所有其他客户端
  5. 连接状态监控:实时监测客户端连接和断开状态

关键数据结构

服务端定义了一个结构体来管理客户端信息:

typedef struct clientIP { SOCKET ac_socket; // 客户端套接字 USHORT port; // 客户端端口号 char ip[30]; // 客户端IP地址 }*LclientIP;

所有连接的客户端信息存储在std::list Socket_IP链表中。

消息处理机制

服务端采用两级消息处理机制:

  1. 连接级消息(NETWORKCONTROL):处理新的连接请求(FDACCEPT)
  2. 数据级消息(ACTURE_CONTROL):处理已连接客户端的读写和关闭事件

当有新客户端连接时:

BOOL CAsyncSocketTCPDlg::OnAccept() { // 接受客户端连接 clientIP temp_object; temp_object.ac_socket = accept(m_Socket, (SOCKADDR *)&sender, &len); // 保存客户端信息 strcpy_s(temp_object.ip, inet_ntoa(sender.sin_addr)); Socket_IP.push_back(temp_object); // 为新连接注册异步事件 WSAAsyncSelect(temp_object.ac_socket, m_hWnd, ACTURE_CONTROL, FD_CLOSE | FD_READ | FD_WRITE); }

消息广播实现:

BOOL CAsyncSocketTCPDlg::OnReceive(clientIP &sock) { // 接收来自某一客户端的消息 recv(sock.ac_socket, buff, 1024, 0); // 向所有客户端广播消息 for (itr=Socket_IP.begin(); itr!=Socket_IP.end(); itr++) { send(itr->ac_socket, temp, num, 0); } }

编码处理

程序完整处理了字符编码转换问题,提供了两个核心转换函数:

  • AnsiToUnicode:将ANSI字符串转换为Unicode字符串
  • UnicodeToAnsi:将Unicode字符串转换为ANSI字符串

这些函数使用Windows API的MultiByteToWideCharWideCharToMultiByte实现编码转换,确保在不同语言环境下正常显示。

界面设计

客户端界面

  • 服务器地址输入框(IPAddress控件)
  • 端口号输入框
  • 连接/断开按钮
  • 消息显示区域
  • 消息输入和发送区域

服务端界面

  • 服务启动/停止按钮
  • 端口配置
  • 在线客户端数量显示
  • 系统日志显示区域

错误处理

程序包含完善的错误处理机制:

  1. Winsock初始化检查:验证Winsock版本兼容性
  2. Socket操作错误码捕获:使用WSAGetLastError获取详细错误信息
  3. 资源释放:确保所有分配的资源和Socket连接正确释放

应用场景

该异步TCP通信程序适用于:

  1. 局域网聊天系统:实现多用户实时文字交流
  2. 监控系统:服务端接收多个数据源的信息
  3. 教学演示:展示Socket编程和异步通信机制
  4. 项目基础框架:可作为更复杂网络应用的开发基础

总结

这个MFC异步TCP通信程序展示了Windows平台下高性能网络通信的完整实现方案。通过异步非阻塞模式和消息驱动架构,程序能够高效处理多个并发连接,同时保持良好的响应性能。其模块化设计和完整的错误处理机制使得代码具有很好的可维护性和扩展性,为开发更复杂的网络应用程序提供了坚实的基础。

http://www.jsqmd.com/news/503153/

相关文章:

  • 协同过滤算法黔醉酒业白酒销售系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
  • Axure原型设计进阶:用Echarts实现这5种高级数据可视化(附代码片段库)
  • 突破传统:用神经网络算子技术构建高效PDE求解器
  • Local Moondream2环境部署:解决transformers版本冲突的标准化容器方案
  • Spring Boot Actuator实战:5分钟搞定健康监控与自定义端点配置
  • 探索FancyZones:重新定义Windows数字工作坊的艺术
  • EmbeddingGemma-300m快速部署:Ollama一键安装与开箱即用教程
  • 暗黑4 d3d12.dll找不到解决方法:安全修复教程与工具对比
  • MRAM的挑战与机遇:为什么它还没完全取代DRAM和FLASH?
  • 手把手教你用雷池WAF打造企业级错误页面:自定义配色+品牌元素植入指南
  • 磁盘性能优化实战:从容量计算到寻址时间降低的5个技巧
  • ADB命令实战:5分钟搞定测试机短信、电话、定位模拟(附常用命令清单)
  • 安全修复暗黑4 d3d12.dll缺失:官方工具与系统修复步骤
  • 2026年东莞文创潮玩厂家哪家好?文创 IP 定制工厂、文创潮玩厂家、文创源头工厂选择指南 - 海棠依旧大
  • 为什么KAN+iTransformer在时间序列预测中表现优异?深入解析其核心机制
  • LiDAR与IMU联合标定实战——从点云到大地坐标系的精准转换
  • 3个生活化场景拆解,零技术也能懂Agent自动
  • AI Agent 落地实战系列 (一):腾讯混元 AI Agent vs EasyClaw 全维度技术实测与选型指南
  • 【MCP协议企业级落地白皮书】:20年架构师实测REST API吞吐量下降47%的真相与迁移决策清单
  • ChatTTS Linux 环境部署实战:从零搭建到避坑指南
  • 从售后政策看降AI率工具的技术实力:敢退款的才是真有底气 - 我要发一区
  • 如何在RK3588开发板上用rknntoolkit2快速部署PyTorch模型(附完整代码)
  • CLIP模型训练实战指南:从问题诊断到优化策略
  • 鸿蒙ArkUI日历组件实战:从基础配置到高级自定义(附完整代码示例)
  • 降AI率行业的售后现状:为什么大多数工具不敢承诺退款 - 我要发一区
  • 文墨共鸣应用场景:快速判断文章相似度,论文查重、文案对比神器
  • 用快马平台快速原型化opencode教程中的Flask应用示例
  • 为什么你的MCP Sampling总在凌晨2:17失效?——基于eBPF追踪的内核级时钟漂移根因分析
  • Attention U-Net实战:用PyTorch实现医学图像分割(附完整代码)
  • 20251914 2025-2026-2 《网络攻防实践》第1周作业