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

TCP计算器:C++网络编程入门

好的,这是一个基于 TCP 协议的简易计算器项目的入门指南,使用 C++ 实现。这个项目将帮助你理解基本的网络通信和协议设计概念。


项目概述

我们将构建一个客户端/服务器模型的计算器:

  1. 服务器端:监听指定端口,接收客户端发送的数学表达式(如2 + 3)。
  2. 客户端端:用户输入表达式,发送到服务器,接收计算结果并显示。
  3. 协议:使用简单文本协议(如表达式\n),服务器返回结果\n错误信息\n

核心步骤

1. TCP 通信基础
  • 服务器流程

    // 创建 socket int server_fd = socket(AF_INET, SOCK_STREAM, 0); // 绑定地址和端口 struct sockaddr_in address; address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(8080); // 端口号 bind(server_fd, (struct sockaddr*)&address, sizeof(address)); // 监听连接 listen(server_fd, 5); // 接受客户端连接 int client_socket = accept(server_fd, nullptr, nullptr);
  • 客户端流程

    int sock = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in serv_addr; serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(8080); inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr); // 服务器 IP connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

2. 计算逻辑实现

服务器端需解析表达式并计算,例如:

double calculate(const std::string& expr) { // 示例:解析 "a op b" std::istringstream iss(expr); double a, b; char op; iss >> a >> op >> b; switch(op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': if(b == 0) throw std::runtime_error("除零错误"); return a / b; default: throw std::runtime_error("无效运算符"); } }

3. 数据传输协议
  • 客户端发送
    "5 * 3\n"(以\n结尾)
  • 服务器响应
    成功:"15\n"
    错误:"错误: 无效运算符\n"

4. 完整代码框架

服务器端

while(true) { char buffer[1024] = {0}; int bytes_read = read(client_socket, buffer, sizeof(buffer)); if(bytes_read <= 0) break; // 连接断开 try { std::string expr(buffer); double result = calculate(expr); std::string response = std::to_string(result) + "\n"; send(client_socket, response.c_str(), response.size(), 0); } catch (const std::exception& e) { std::string err = "错误: " + std::string(e.what()) + "\n"; send(client_socket, err.c_str(), err.size(), 0); } }

客户端端

std::string expr; std::cout << "输入表达式 (如 2+3): "; std::getline(std::cin, expr); expr += '\n'; // 添加协议结尾 send(sock, expr.c_str(), expr.size(), 0); char response[1024] = {0}; read(sock, response, sizeof(response)); std::cout << "结果: " << response;

编译与测试

  1. 编译
    # 服务器 g++ server.cpp -o server -lpthread # 客户端 g++ client.cpp -o client
  2. 运行
    ./server # 先启动服务器 ./client # 再启动客户端

扩展建议

  1. 支持复杂表达式:使用栈解析中缀表达式(如(1+2)*3)。
  2. 多线程:服务器用线程池处理并发请求。
  3. 错误恢复:添加超时重传机制。
  4. 协议优化:改用二进制协议(如struct { double a,b; char op; })。

通过此项目,你将掌握 TCP 通信、简单协议设计和 C++ 网络编程基础。尝试逐步扩展功能以加深理解!

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

相关文章:

  • 东华复试OJ二刷复盘16
  • 基于RBP神经网络PID自适应控制模型的Matlab仿真解析与实践指导
  • 如何通过运动干预改善儿童多动症的注意力问题?
  • 基于Real-ESRGAN的文档图像增强微调:去除订书钉折痕及阴影
  • 2026下学期课前歌合集
  • 2026年心理学论文降AI率工具推荐:量表描述和数据分析部分怎么降 - 还在做实验的师兄
  • 华为交换机Sub主从IP地址配置(单个VLAN,实现多个网段互相通信)
  • 单相逆变器Matlab仿真:TCM模式和CCM模式
  • Python枚举的高级玩法:从状态机到策略模式的优雅实现
  • 第九章 动态规划part06
  • 2026年摘要和结论AI率特别高怎么办?这两个部分的针对性降AI技巧 - 还在做实验的师兄
  • Dify RAG召回优化终极方案(2026 Q1生产环境验证版)
  • 从L1到L3:图解现代CPU缓存如何影响你的游戏帧数
  • 2026年新闻传播学论文降AI工具推荐:新传同学实测好用的几款 - 还在做实验的师兄
  • Hadoop 3.3.4集群性能调优实战:基于1主3从架构的CentOS7配置详解
  • MCP SDK多语言一致性保障方案:从代码生成器定制到ABI校验工具链(含开源CLI工具v1.2正式版)
  • Jlink与CMSIS-DAP仿真器:如何根据项目需求选择最佳调试工具
  • 2026年知网和维普双检测都要过?一套方案搞定两个平台 - 还在做实验的师兄
  • 从幼小衔接看起:2026年主流学习机一年级适配性比较 - 速递信息
  • 从ME11到MEK1:SAP采购条件记录创建的BAPI性能对比(含RV_CONDITION_COPY完整示例)
  • django重复导入可能会导致未知错误------无法识别某个函数
  • 筑牢Web安全防线:全面解析SQL注入与XSS攻击防护
  • ABC 450G - Random Subtraction 题解
  • 降AI工具的风格迁移技术是什么意思?通俗解读背后的原理 - 还在做实验的师兄
  • springboot基于vue美剧观影点评网站的设计与实现
  • 深入理解OPTIONS请求:跨域预检的机制与实践
  • 嘎嘎降AI手机端怎么用?不带电脑也能降AI的完整教程 - 还在做实验的师兄
  • 从EDKII编译到Flash烧录:深入理解UEFI固件FDF文件如何塑造FD/FV层级
  • 嘎嘎降AI普通模式vs深度改写模式:什么情况该用哪个 - 还在做实验的师兄
  • 2026年艺术类论文降AI率工具实测:设计和美术方向哪款最合适 - 还在做实验的师兄