回声服务器项目

项目概述

本项目是一个基于 Linux C++ 的回声服务器(Echo Server)实现,包含服务端和客户端两个部分。服务器能够接收客户端发送的消息,并将消息原样返回给客户端,同时实现了一个特定的对话场景。

项目文件:

  • server.cpp - 服务端代码

  • client.cpp - 客户端代码

  • CMakeLists.txt - 项目构建配置

核心功能

  • 基本回声:服务端将客户端发送的消息原样返回

  • 特定对话:针对特定问题返回预设回答

  • 自动重连:客户端在连接断开时自动重新连接

  • 多轮对话:支持连续的对话交互

遇到的问题与解决方案

1. 端口不匹配

  • 问题:客户端无法连接服务端

  • 原因:服务端使用 8080 端口,客户端使用 6666 端口

  • 解决方案:统一使用 8080 端口

2. 字符串比较错误

  • 问题:服务端无法正确识别客户端消息

  • 原因 :使用 == 比较字符串,应该使用 strcmp

  • 解决方案 :修改为 strcmp(buffer, "Do you like C++?") == 0

3. 发送长度错误

  • 问题:服务端发送的数据包含垃圾值

  • 原因 :使用 sizeof(buffer) 发送整个缓冲区

  • 解决方案 :使用 strlen(buffer) 发送实际长度

4. 连接关闭与自动重连

  • 问题:服务端发送完 "And you?" 后主动关闭连接,客户端需要重新输入两次才能继续

  • 原因:服务端关闭连接后,客户端仍然尝试向已关闭的 socket 写入数据,导致数据丢失

  • 解决方案:客户端实现自动重连机制,检测到连接断开后重新建立连接,并重发最后一条消息

5. SIGPIPE 信号

  • 问题:向已关闭的连接写入时程序直接终止

  • 原因:默认收到 SIGPIPE 信号会终止进程

  • 解决方案 :添加 signal(SIGPIPE, SIG_IGN) 忽略该信号,通过 write 返回值判断连接状态

6. 消息分割问题

  • 问题:服务端发送多条消息时客户端只收到一条

  • 原因:TCP 是字节流协议,消息可能被合并发送或分片接收

  • 解决方案 :使用换行符 \n 作为消息分隔符,客户端按换行符拆分处理

7. 残留进程导致端口占用

  • 问题:启动服务端时出现 "Bad file descriptor" 错误,且无限循环

  • 原因:之前的服务端进程没有完全关闭,端口仍被占用

  • 解决方案 :添加错误检查,确保套接字创建、绑定、监听成功;启动前使用 killalllsof 清理残留进程

项目特点

1. 教育价值

  • 代码注释详细:每个关键步骤都有注释说明

  • 错误处理完善:展示了网络编程中常见错误的处理方法

  • 流程清晰:从套接字创建到连接关闭的完整流程一目了然

2. 技术特点

  • 自动重连机制:客户端在连接断开时自动重新连接并恢复通信

  • 智能消息处理:支持多条消息的分割和按行解析

  • 信号处理 :正确处理 SIGPIPE,避免程序意外崩溃

  • 健壮性:完善的错误检查和处理,提升程序稳定性

3. 功能特点

  • 特定对话支持:针对 "Do you like C++?" 等问题的特定回答,增加趣味性

  • 多轮对话:支持连续的对话交互,模拟真实聊天场景

  • 灵活输入:客户端支持自由输入,不仅限于预设问题

4. 可扩展性

  • 模块化设计:代码结构清晰,易于添加新功能

  • 参数可配置:端口等参数可以轻松修改

  • 跨平台:基于标准套接字 API,可在 Linux、macOS 及 Windows(WSL/Cygwin)上运行

运行方法

编译

复制代码
mkdir -p build && cd build
cmake .. && make

运行

  1. 启动服务端

    复制代码
    ./echo_server
  2. 启动客户端

    复制代码
    ./echo_client

示例对话

复制代码
client: Do you like C++?
server: Yes,I do.
client: Why do you like C++?
server: Because I can use it to write programs.
server: And you?
// 此时服务端主动断开连接,客户端自动重连并重新发送消息
client: Me too
server: Me too

学习收获

  • 网络编程基础 :掌握 socket API 的使用方法,包括 socket, bind, listen, accept, connect, read, write

  • TCP 协议理解:深入理解 TCP 连接的建立、维护和关闭过程,以及字节流特性

  • 错误处理能力:学习如何处理网络编程中的各种错误(端口占用、连接断开、信号等)

  • 问题解决思路:从现象分析、原因定位到解决方案的完整闭环

  • 项目构建:使用 CMake 管理 C++ 项目的构建和依赖

总结

本项目通过实现一个功能完整的回声服务器,展示了网络编程的基本原理和实践方法。它不仅是学习 C++ 网络编程的良好起点,也为理解客户端-服务器架构提供了实际例子。通过解决项目开发过程中遇到的各种问题,我们可以更深入地理解网络编程的复杂性和解决方案,为后续更复杂的网络应用开发打下坚实基础。

github源码

Cando02/echoServer

相关推荐
宝耶2 小时前
[特殊字符] 操作日志模块复习笔记
java·开发语言·jvm
不想写代码的星星2 小时前
我写的代码竟然敢和我比摸鱼?C++ 延迟计算那些事儿
c++
好好研究2 小时前
Java基础学习(十三):IO流基础
java·开发语言·学习·io流
知识分享小能手2 小时前
R语言入门学习教程,从入门到精通,R语言传统绘图系统 - 完整知识点与案例代码(2)
开发语言·学习·r语言
cui_ruicheng2 小时前
Linux库制作与使用(三):ELF加载与动态链接机制
linux·运维·服务器
代龙涛2 小时前
WordPress archive.php 分类与归档页面开发指南
开发语言·后端·php·wordpress
格林威2 小时前
面阵相机 vs 线阵相机:堡盟与大恒相机选型差异全解析 附C++ 实战演示
开发语言·c++·人工智能·数码相机·计算机视觉·视觉检测·工业相机
xyq20242 小时前
相邻节点迭代器
开发语言
YSF2017_32 小时前
C语言15-makefile(2)——makefile的自定义变量及两个函数
c语言·开发语言