TCP 回声服务器与客户端的完整实现与原理详解
📅 2026/7/11 12:31:57
👁️ 次浏览
目录一、TCP 通信的核心逻辑二、TCP 服务器编程步骤步骤 1:创建监听 Socket步骤 2:绑定地址与端口(bind)步骤 3:设置监听状态(listen)步骤 4:接收客户端连接(accept)步骤 5:与客户端交互(read/write)步骤 6:关闭连接(close)步骤 7:并发处理(可选但重要)三、TCP 客户端编程步骤步骤 1:创建客户端 Socket步骤 2:连接服务器(connect)步骤 3:与服务器交互(read/write)步骤 4:关闭连接四、核心代码解析1. 辅助工具:InetAddr 类(网络地址处理)2. 服务器端实现:TcpServer 类(1)初始化服务器:socket→bind→listen(2)接收连接与处理请求:accept→read/write3. 客户端实现:TcpClient4. 编译脚本:Makefile五、运行演示步骤 1:编译程序步骤 2:启动服务器步骤 3:启动客户端(新终端)步骤 4:交互测试六、常见问题与解决方案七、扩展与进阶方向八、总结在网络编程的学习旅程中,TCP 协议是绕不开的核心内容。它作为一种面向连接的可靠传输协议,支撑着互联网中绝大多数的应用通信。本文将结合一套完整的 C++ 实现代码,从基本原理到具体实践,带你掌握 TCP 编程的全流程 —— 从 socket 创建到多进程并发处理,最终实现一个可交互的 "回声" 程序。一、TCP 通信的核心逻辑TCP(Transmission Control Protocol)的通信模型遵循固定的 "连接 - 传输 - 断开" 流程,核心特点是面向连接和可靠传输:角色划分:通信双方分为服务器(被动等待连接)和客户端(主动发起连接)连接建立:通过 "三次握手" 建立可靠连接,确保双方都做好通信准备数据传输:基于字节流的方式传输数据,通过确认机制保证数据不丢失、不重复连接关闭:通过 "四次挥手" 优雅关闭连接,确保双方数据都已传输完成本次实现的 "回声程序" 是 TCP 编程的经典入门案例:客户端发送任意字符串,服务器接收后添加 "server echo#" 前缀返回,直观展示完整通信流程。二、TCP 服务器编程步骤服务器的核心功能是 "监听连接→接收请求→处理交互",完整步骤如下:步骤 1:创建监听 SocketSocket(套接字)是网络通信的 "门户",本质是操作系统提供的网络通信接口(文件描述符)。// 创建TCP监听Socket int listensockfd = socket(AF_INET, SOCK_STREAM, 0); if (listensockfd 0) { // 错误处理:创建失败(如协议不支持) perror("socket error"); exit(1); }参数解析AF_INET:使用 IPv4 地址族(互联网最常用)SOCK_STREAM:指定为流式套接字(TCP 协议的特征)0:自动选择对应的数据传输协议(此处为 TCP)步骤 2:绑定地址与端口(bind)创建 Socket 后,需要将其与本机的具体 IP 和端口绑定,明确 "监听哪个地址的请求"。// 准备地址结构(网络字节序) struct sockaddr_in local_addr; memset(local_addr, 0, sizeof(local_addr)); local_addr.sin_family = AF_INET; // IPv4 local_addr.sin_port = htons(8081); // 端口(主机字节序→网络字节序) local_addr.sin_addr.s_addr = INADDR_ANY; // 绑定所有本地IP(多网卡场景适用) // 绑定操作 int ret = bind(listensockfd, (struct sockaddr*)local_addr, sizeof(local_addr)); if (ret 0) { perror("bind error"); exit(2); }关键细节:网络字节序:TCP 规定网络中数据必须使用大端字节序,htons()(host to network short)用于端口转换INADDR_ANY:表示绑定本机所有可用 IP(无需手动指定具体 IP,灵活适配多网卡环境)步骤 3:设置监听状态(listen)绑定完成后,需将 Socket 转为 "监听状态",准备接收客户端的连接请求。// 开始监听(BACKLOG=8:未完成连接队列的最大长度) int ret = listen(listensockfd, 8); if (ret 0) { perror("listen error"); exit(3); }BACKLOG 参数:限制正在进行三次握手(未完成连接)的最大数量,超过此值的新连接会被暂时拒绝。步骤 4:接收客户端连接(accept)监听状态的 Socket 可以通过accept()函数阻塞等待并接收客户端连接。struct sockaddr_in client_addr; // 存储客户端地址 socklen_t client_addr_len = sizeof(client_addr); // 阻塞等待新连接,返回与该客户端通信的Socket int clientsockfd = accept(listensockfd, (struct sockaddr*)client_addr, client_addr_len); if (clientsockfd 0) { perror("accept error"); continue; // 忽略错误,继续等待下一个连接 }核心特性:accept()是阻塞函数,若无新连接则一直等待成功返回新的 Socket 描述符(专门用于与当前客户端通信)原监听 Socket(listensockfd)继续用于接收其他连接步骤 5:与客户端交互(read/write)连接建立后,通过read()和write()实现数据收发。char buffer[4096]; while (true) { // 读取客户端数据 ssize_t n = read(clientsockfd, buffer, sizeof(buffer) - 1); if (n 0) { // 读取成功 buffer[n] = '\0'; // 手动添加字符串结束符 // 处理数据(示例:添加前缀后回送) std::string response = "server: " + std::string(buffer); write(clientsockfd, response.c_str(), response.size()); } else if (n == 0) { // 客户端主动关闭连接 std::cout "client closed" std::endl; break; } else { // 读取错误(如网络异常) perror("read error"); break; } }注意事项:read()返回值需严格判断:正数为实际读取字节数,0 表示对方关闭,负数表示错误避免假设 " 一次read()能获取完整数据 "(TCP 是流式协议,数据可能分多次到达)步骤 6:关闭连接(close)交互结束后,关闭 Socket 释放资源:close(clientsockfd); // 关闭与客户端的连接Socket // 服务器退出时关闭监听Socket // close(listensockfd);
VisualCppRedist AIO:终结DLL缺失困扰的终极解决方案 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist
你是否曾经在打开某个游戏或专业软件时…
📅 2026/7/11 12:31:57
Windows APK安装器:3分钟在电脑上安装Android应用的终极方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer
还在为电脑上无法直接运行Android应用而烦恼吗…
📅 2026/7/11 12:30:56
Gadgetbridge终极指南:开源智能设备管理完全解决方案 【免费下载链接】Gadgetbridge We are on codeberg.org now! https://codeberg.org/Freeyourgadget/Gadgetbridge - Gadgetbridge - A free and cloudless replacement for your gadget vendors closed source A…
📅 2026/7/11 12:30:56
MateCloud商业应用:SaaS平台商业化部署方案终极指南 【免费下载链接】matecloud 🔥MateCloud是一款基于Spring Cloud Alibaba的微服务架构。目前已经整合Spring Boot 4.0.7、 SpringCloud 2025、Spring Cloud Alibaba 2025、Spring Security Oauth2、Fei…
📅 2026/7/11 13:24:16
如何快速解锁联想拯救者BIOS隐藏功能:终极操作指南 【免费下载链接】LEGION_Y7000Series_Insyde_Advanced_Settings_Tools 支持一键修改 Insyde BIOS 隐藏选项的小工具,例如关闭CFG LOCK、修改DVMT等等 项目地址: https://gitcode.com/gh_mirrors/le/L…
📅 2026/7/11 13:24:16
CodableAlamofire核心功能解析:responseDecodableObject方法详解 【免费下载链接】CodableAlamofire An extension for Alamofire that converts JSON data into Decodable objects. 项目地址: https://gitcode.com/gh_mirrors/co/CodableAlamofire
在Swift开…
📅 2026/7/11 13:24:16
Model 模块架构 【免费下载链接】runtime 本项目提供CANN运行时组件和维测功能组件。 项目地址: https://gitcode.com/cann/runtime
1. 模块概述
功能介绍:Model 模块负责管理计算图的执行模型,包括模型创建、Stream 绑定、任务加载、模型执行和…
📅 2026/7/11 13:24:16
NtyTcp内存池设计原理:高效内存管理的实现细节 【免费下载链接】NtyTcp 单线程用户态TCP/IP协议栈,epoll实现,包含服务器案例,并发测试案例 项目地址: https://gitcode.com/gh_mirrors/nt/NtyTcp
NtyTcp作为一款单线程用户…
📅 2026/7/11 13:24:16
1. 项目概述:从“能用”到“好用”的API经济账最近和几个做AI应用的朋友聊天,发现大家普遍面临一个甜蜜的烦恼:产品用上了ChatGPT这类大模型的API,效果确实惊艳,但月底一看账单,心也跟着惊了一下。尤其是当…
📅 2026/7/11 13:23:16
摘要前面系列教程覆盖了 ArkUI 组件、路由、生命周期、本地存储、网络请求、Ability 底层全套基础能力,本篇统一梳理标准工程目录分层、模块化拆分、代码复用规范、全局工具统一管理、项目打包权限配置、常见工程报错统一解决方案,形成可直接用于课程设计…
📅 2026/7/11 0:00:31
1. 命令简介gpm 是 Linux 系统下运行于虚拟控制台(文字终端模式)的鼠标服务器。它的主要功能是在没有图形界面的纯文本环境中,为虚拟控制台提供鼠标支持,允许用户使用鼠标进行文本的选择、复制和粘贴操作,极大地提升了…
📅 2026/7/11 0:00:31
导语
先澄清一个常被混用的概念:BI试点"上线",并不等于试点"验收通过"。很多企业把仪表板做出来、账号发下去、培训开完场,就默认试点已经跑通,随后进入推广阶段——结果推广到第二个部门、第三个业务线时&am…
📅 2026/7/11 0:00:31
1. 项目背景与核心需求 在嵌入式系统开发中,快速精确的数据检索是一个常见但极具挑战性的需求。特别是在工业控制、医疗设备和物联网终端等场景下,系统往往需要在毫秒级时间内完成关键参数的读取和写入操作。传统基于Flash存储的方案存在擦写次数有限、操…
📅 2026/7/10 22:46:54
1. 工业电流环信号传输的基础认知在工业自动化领域,4-20mA电流环传输技术已经持续服役超过半个世纪。这种看似简单的信号传输方式之所以能经久不衰,核心在于其独特的抗干扰能力——电流信号在长距离传输时几乎不受线路电阻和电压波动的影响。我曾在化工厂…
📅 2026/7/10 22:46:54
最近在项目里尝试用 YOLO 做目标检测,从环境搭建到模型训练,再到推理部署,整个过程踩了不少坑。网上的资料虽然多,但要么版本老旧,要么步骤零散不成体系,对于刚入门的新手来说,很容易卡在某个环…
📅 2026/7/10 22:46:54
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/10 22:46:54
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/10 22:46:54
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/10 22:46:54