TCP/IP 网络编程 | 服务端 客户端的封装

设计模式

文章目录

  • 设计模式
    • 一、`socket.h` 接口(interface)
    • 二、`socket.cpp` 实现(implementation)
    • 三、`server.cpp` 使用封装(main 函数)
    • 四、`client.cpp` 使用封装(main 函数)
    • 五、退出方法
    • 六、终端输出

一、socket.h 接口(interface)

#ifndef SOCKET_H
#define SOCKET_H#include <string>
using std::string;class Socket
{
public:Socket();~Socket();bool bind(int port);bool listen(int backlog = 5);int accept();bool connect(const string &ip, int port);  // ✅ 客户端连接方法int fd() const { return m_sockfd; } // 可选:暴露 sockfd 方便客户端用private:int m_sockfd;
};#endif // SOCKET_H

二、socket.cpp 实现(implementation)

// socket.cpp
#include "socket.h"#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <cstring>
#include <cstdio>
#include <cerrno>using std::string;Socket::Socket()
{m_sockfd = ::socket(AF_INET, SOCK_STREAM, 0);if (m_sockfd < 0){printf("Socket creation failed: errno=%d, errmsg=%s\n", errno, strerror(errno));}
}Socket::~Socket()
{if (m_sockfd >= 0){::close(m_sockfd);}
}bool Socket::connect(const string &ip, int port)
{sockaddr_in addr;std::memset(&addr, 0, sizeof(addr));addr.sin_family = AF_INET;addr.sin_port = htons(port);if (::inet_pton(AF_INET, ip.c_str(), &addr.sin_addr) <= 0){printf("Invalid IP address: %s\n", ip.c_str());return false;}int ret = ::connect(m_sockfd, (struct sockaddr*)&addr, sizeof(addr));if (ret < 0){printf("Connect failed: errno=%d, errmsg=%s\n", errno, strerror(errno));return false;}return true;
}void Socket::close()
{if (m_sockfd >= 0){::close(m_sockfd);m_sockfd = -1;}
}

三、server.cpp 使用封装(main 函数)

#include "socket.h"#include <iostream>
#include <unistd.h>    // read(), write()
#include <cstring>     // memsetint main()
{Socket server;if (!server.bind(8888)){std::cerr << "Failed to bind port 8888" << std::endl;return 1;}if (!server.listen()){std::cerr << "Failed to listen on port 8888" << std::endl;return 1;}std::cout << "Server listening on port 8888..." << std::endl;while (true){int client_fd = server.accept();if (client_fd < 0){continue; // accept failed}char buffer[1024];ssize_t n = ::read(client_fd, buffer, sizeof(buffer) - 1);if (n > 0){buffer[n] = '\0';std::cout << "Received: " << buffer << std::endl;std::string response = "Echo: ";response += buffer;::write(client_fd, response.c_str(), response.size());}::close(client_fd);}return 0;
}

四、client.cpp 使用封装(main 函数)

#include "socket.h"#include <iostream>
#include <unistd.h>     // read(), write()
#include <cstring>      // strlen()int main()
{Socket client;if (!client.connect("127.0.0.1", 8888)){std::cerr << "Failed to connect to server." << std::endl;return 1;}std::cout << "Connected to server." << std::endl;std::string input;while (true){std::cout << "Enter message: ";std::getline(std::cin, input);if (input == "exit")break;::write(client.fd(), input.c_str(), input.size());char buffer[1024];ssize_t n = ::read(client.fd(), buffer, sizeof(buffer) - 1);if (n > 0){buffer[n] = '\0';std::cout << "Server response: " << buffer << std::endl;}else{std::cout << "Server closed connection." << std::endl;break;}}return 0;
}

五、退出方法

  1. 客户端:
    当你在客户端输入:
Enter message: exit

客户端程序会退出(break 出循环)。

  1. 服务器:
    • 当前版本是永不退出的死循环
    • 你可以使用 Ctrl+C 来中断服务器进程

六、终端输出

  1. 终端 1:服务器
$ ./server
Server listening on port 8888...
Received: hello
Received: world
  1. 终端 2:客户端
$ ./client
Connected to server.
Enter message: hello
Server response: Echo: helloEnter message: world
Server response: Echo: worldEnter message: exit

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/909123.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TASTE-Rob:推进面向任务的手-目标交互视频生成,实现可通用的机器人操作

25年3月来自香港中文大学的论文“TASTE-Rob: Advancing Video Generation of Task-Oriented Hand-Object Interaction for Generalizable Robotic Manipulation”。 本文也是在解决现有数据集和模型在面向任务的手部-目标交互视频生成方面的关键限制&#xff0c;这是为机器人模…

Trae AI IDE 全网最全的使用教程

Trae AI IDE 全网最全的使用教程 近期&#xff0c;字节发布了一款 AI Coding 产品 —— Trae&#xff0c;它是一款对标 Cursor 和 Windsurf 的全新 IDE&#xff0c;也是一款真正为中文开发者量身定制的工具&#xff0c;可谓是中文开发者的福音。 其优雅的 UI、丝滑的交互、母语…

GraspCorrect:通过视觉-语言模型引导反馈进行机器人抓握矫正

25年3月来自韩国 POSTECH 的论文 “GraspCorrect: Robotic Grasp Correction via Vision-Language Model-Guided Feedback”。 尽管机器人操作技术取得了显著进步&#xff0c;但实现一致且稳定的抓取仍然是一项根本挑战&#xff0c;常常限制复杂任务的成功执行。分析表明&…

浏览器兼容-polyfill-本地服务-优化

babel和webpack结合 npx babel src --out-dir dist --presetsbabel/preset-env 这是把src下面的东西都用babel转化一下 webpack可以和babel结合使用&#xff0c;首先下载一个这东西&#xff1a; npm install babel-loader -D webpack配置&#xff1a; const path requir…

组织结构图软件:数据驱动的可视化架构管理工具

1. 组织结构图软件概述 组织结构图概念 组织结构图是一种图形化工具&#xff0c;用于展示组织内部的层级关系、部门职能和人员分工。它通过清晰的线条和文本框连接&#xff0c;直观呈现企业或机构的架构&#xff0c;帮助管理者和员工快速理解组织的运作模式。 重要性 在企业…

大数据学习(138)-Hive数据分析3

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…

深度学习环境搭建(pycharm+yolov5)

B站 &#xff1a;道传科技上位机 观看教程 一、pycharm的安装 pycharm windows版本下载地址&#xff1a;Download PyCharm: The Python IDE for data science and web development by JetBrains 下载社区版本&#xff08;日常学习使用够用了&#xff09;&#xff0c;专业版…

K8S中应用无法获取用户真实ip问题排查

现象 领导反馈生产环境的用户ip有问题。登陆到这个页面&#xff0c;发现是所有的用户ip都是172.30.94.97&#xff0c;这是个内部网络ip. 排查过程 1 登陆到应用前端nginx&#xff0c; 查看nginx的请求日志 172.30.94.97 - - [17/Jul/2024:02:02:54 0000] "POST /***/n…

2.倒排索引

传统数据库mysql使用的是正向索引 词条是不允许重复的&#xff0c;给词条创建唯一索引&#xff0c;根据词条查找的速度就很快了。

【Android Studio】新建项目及问题解决

新建项目 按照《Android 第一行代码》中 1.3 小节的步骤创建项目。 注意&#xff1a;Minimum API Level 用于设置项目的最低兼容版本。Android 5.0 以上的系统已经占据超过了 99.9% 的 Android 市场份额&#xff0c;因此这里指定为 API 21: Android 5.0 即可。 问题解决 &…

SX1268低功耗sub-1g芯片支持lora和GFSK调制

SX1268 射频收发器是长距离无线应用的理想设备&#xff0c;支持410-810MHZ。它专为长电池寿命而设计&#xff0c;仅消耗4.2 mA的主动接收电流。SX1268 可以使用高效的集成功率放大器在490 MHz传输高达 22 dBm 的信号。在 780 MHZ时&#xff0c;SX1268 在天线端口传输10dBm的信号…

C#高级:利用反射让字符串决定调用哪个方法

一、反射的实现 using System; using System.Reflection; using System.Threading.Tasks;public class Calculator {public int Add(int a, int b){return a b;}public int Subtract(int a, int b){return a - b;}public int Multiply(int a, int b){return a * b;}public do…

图像二分类任务推荐使用Sigmoid函数‌

‌图像二分类任务中可以使用Softmax作为激活函数&#xff0c;但通常更推荐使用Sigmoid函数‌。Softmax函数可以将多个类别的输出转换成概率分布&#xff0c;适合多分类任务。在二分类任务中&#xff0c;虽然可以使用Softmax&#xff0c;但它会生成两个输出值&#xff08;每个类…

湖北理元理律师事务所:债务优化的法律逻辑与生活平衡术

在债务纠纷数量年均增长19%的背景下&#xff08;最高人民法院2023年数据&#xff09;&#xff0c;专业法律服务机构的价值不仅在于解决纠纷&#xff0c;更在于重构债务人与生活的平衡关系。湖北理元理律师事务所的实践显示&#xff0c;科学的债务优化需同时满足三个维度&#x…

window 显示驱动开发-处理视频帧

Microsoft Direct3D 运行时调用用户模式显示驱动程序的 VideoProcessBeginFrame 和 VideoProcessEndFrame 函数&#xff0c;以指示用户模式显示驱动程序可以处理视频帧的这些函数调用之间的时间段。 在用户模式显示驱动程序可以处理任何视频帧之前&#xff0c;Microsoft Direct…

基于 React Native for HarmonyOS5 的跨平台组件库开发指南,以及组件示例

基于 React Native for HarmonyOS5 的跨平台组件库开发&#xff0c;需融合分层架构设计、鸿蒙原生能力桥接及性能优化技术&#xff0c;核心指南如下&#xff1a; ‌一、分层架构设计‌ 采用 ‌模块化分层结构‌&#xff0c;隔离平台差异逻辑&#xff1a; ├── common_har …

一站式了解单例模式

引言 这是设计模式专栏的第一篇文章&#xff0c;在这个专栏里面会讲到我们在开发中经常使用的设计模式&#xff0c;我会用心将它们解析&#xff0c;然后讲给你们听&#xff0c;如果感兴趣可以持续关注这个专栏❤️ 这次我们要讲的是单例模式&#xff0c;这个在大厂面试中十分…

Java应用Flink CDC监听MySQL数据变动内容输出到控制台

文章目录 maven 依赖自定义数据变化处理器flink cdc监听验证 maven 依赖 <properties><flink.version>1.14.0</flink.version><flink-cdc.version>2.3.0</flink-cdc.version></properties><dependencies><!-- Flink dependencie…

猎板厚铜PCB工艺能力如何?

在电子产业向高功率、高集成化狂奔的今天&#xff0c;电路板早已不是沉默的配角。当5G基站、新能源汽车、工业电源等领域对电流承载、散热效率提出严苛要求时&#xff0c;一块能够“扛得住大电流、耐得住高温”的厚铜PCB&#xff0c;正成为决定产品性能的关键拼图。而在这条赛道…

业务:资产管理功能

文章目录 一、项目背景1.1概述1.2编写目的 二、注意点说明三、页面效果四、代码AssetManagementControllerHwinfoAssetManagementHwinfoAssetManagementServiceHwinfoAssetManagementServiceImplHwinfoAssetManagementMapperHwinfoAssetManagementMapper.xmlSfpAssetManagement…