一、Socket创建和连接

C++网络编程(asio)

文章目录

  • C++网络编程(asio)
  • 1、Asio概述
  • 2、网络编程基本流程
    • 2、创建socket
    • 3、创建监听socket
    • 4、绑定accpet监听套接字
    • 5、连接指定的端点
    • 6、服务器接收连接

点击查看代码

1、Asio概述

​ Asio起源于Boost库,是一款专为网络I/O定时器串行端口通信设计的库,提供了同步和异步的编程模型,用以简化网络和低级I/O的操作。asio封装了操作系统一些底层机制如select、socket、poll/epoll等,以实现异步IO模型

Asio异步处理,可以使任务触发时不需要等待,继续往下执行其他任务,直至其它线程将处理完成,并回调通知此线程。

普通的网络编程,通常是指使用传统的系统调用和同步阻塞的方式进行网络通信,可以看看代码:
点击进入
其中的accept、recv、listen等函数默认是同步/阻塞的。

下面将使用Boost.Asio库对网络编程进行重写

2、网络编程基本流程

服务器端

  1. socket : 创建socket对象
  2. bind : 绑定本机ip+port
  3. listen : 监听。若监听到信号,建立连接
  4. accept : 接受客户端的连接请求,返回一个新的Socket对象用于与客户端通信。原因是现实中服务器对应多个客户端,每个客户端对应相应的socket对象进行收发信息
  5. read、write : 收发信息

客户端

  1. socket : 创建socket对象
  2. connect : 根据服务器ip+port,发送连接请求
  3. write、read : 发收信息

请添加图片描述## 1、创建终端节点

概念:所谓终端节点就是用来通信的端对端的节点,可以通过ip地址和端口构造,其他节点可以连接这个终端节点做通信.

客户端,我们可以通过对端(服务器端)的ip和端口构造一个endpoint,用这个endpoint和其通信。

int client_end_point() {std::string raw_ip_address = "127.0.0.1";unsigned short port_num = 3333;boost:system::error_code ec; // 错误码// asio提供转换地址asio::ip::address ip_address = asio::ip::address::from_string(raw_ip_address, ec);if (ec.value() != 0) {std::cout << "Failed to parse the IP Address. Error code = " << ec.value() << ". Message is " << ec.message();return ec.value();}// bind(ip+address)asio::ip::tcp::endpoint ep(ip_address, port_num);return 0;
}

此时,ep 对象表示客户端端点,可以用于连接指定的服务器上的 TCP。然而,代码并没有显示实际连接过程或与服务器的任何通信,因此它只是为将来使用而准备端点。

服务端,则只需根据本地地址绑定就可以生成endpoint

int server_end_point()
{unsigned short port_num = 3333;// 服务器将监听主机上的所有可用 IPv6 地址asio::ip::address ip_address = asio::ip::address_v6::any();asio::ip::tcp::endpoint ep(ip_address, port_num);return 0;
}

此时,ep 对象表示一个可以用于监听传入连接请求的 TCP 端点,其 IP 地址为所有可用的 IPv6 地址,而端口号由函数参数 port_num 决定。

2、创建socket

服务器和客户端socket一致,创建socket分为4步,

  1. 创建上下文io_context
  2. 选择协议
  3. 生成socket
  4. 打开socket
int create_tcp_socket()
{// 上下文告诉socket,此socket为ioc服务asio::io_context ioc;// IPV4的TCP协议asio::ip::tcp protocol = asio::ip::tcp::v4();asio::ip::tcp::socket socket(ioc);boost::system::error_code ec;socket.open(protocol, ec);if (ec.value() != 0) {std::cout << "Failed to open the socket. Error code = " << ec.value() << ". Message is " << ec.message();}return 0;
}

这段代码演示了如何使用 Boost.Asio 库来创建并打开一个 TCP 套接字

3、创建监听socket

服务端,我们还需要生成一个acceptorsocket,用来监听接收新来自客户端的连接

int create_acceptor_socket()
{asio::io_context ioc;asio::ip::tcp::acceptor a(ioc, asio::ip::tcp::endpoint(asio::ip::tcp::v4(), 3333));return 0;
}

这段代码演示了如何使用 Boost.Asio 库来创建并打开一个监听套接字,用于接受传入的连接请求。监听套接字通常用于服务器端,用于等待客户端的连接。

4、绑定accpet监听套接字

对于accept类型的socket服务器要将其绑定到指定的断点,所有连接这个端点的连接都可以被接收到。

  • 创建端点(ip+端口)。
  • 创建监听套接字acceptor
  • 绑定监听套接字acceptor
int bind_acceptor_socket()
{unsigned short port_num = 3333;asio::ip::tcp::endpoint ep(asio::ip::address_v4::any(), port_num);asio::io_context ioc;asio::ip::tcp::acceptor acceptor(ioc, ep.protocol());boost::system::error_code ec;acceptor.bind(ep, ec);if (ec.value() != 0) {std::cout<< "Failed to bind the acceptor socket. Error code = "<< ec.value() << ". Message is " << ec.message();}return 0;
}

这段代码展示了如何使用 Boost.Asio 库创建一个绑定到指定 IP 地址和端口的监听套接字,用于等待客户端的连接请求。

5、连接指定的端点

作为客户端可以连接服务器指定的端点进行连接

  • 创建端点(ip+端口)。
  • 创建通信socket套接字。
  • 通信socket套接字连接到指定端点。
int connect_to_end()
{std::string raw_ip_address = "192.168.1.124";unsigned short port_num = 3333;try{asio::ip::tcp::endpoint ep(asio::ip::address::from_string(raw_ip_address), port_num);asio::io_context ioc;asio::ip::tcp::socket socket(ioc, ep.protocol());socket.connect(ep);}catch (system::system_error &e){std::cout << "Error connect! Error code = " << e.code()<< ". Message: " << e.what();return e.code().value();}return 0;
}

这段代码用于在客户端创建套接字并连接到服务器,以便与服务器进行数据交换。

6、服务器接收连接

当有客户端连接时,服务器需要接收连接:

  • 创建端点(ip+端口)。
  • 创建监听套接字acceptor
  • 绑定监听套接字acceptor
  • 监听队列大小。
  • 创建与客户端通信套接字。
  • 接收客户端连接。
int accept_int_connection()
{// 缓冲来不及接收的信息const int BACKLOG_SIZE = 30;unsigned short port_num = 3333;asio::ip::tcp::endpoint ep(asio::ip::address_v4::any(), port_num);asio::io_context ioc;try{asio::ip::tcp::acceptor acceptor(ioc, ep.protocol());acceptor.bind(ep);acceptor.listen(BACKLOG_SIZE);asio::ip::tcp::socket socket(ioc);acceptor.accept(socket);}catch (system::system_error& e){std::cout << "Error accept! Error code = " << e.code()<< ". Message: " << e.what();return e.code().value();}return 0;
}

这段代码用于在服务器端创建接受套接字,绑定端点并开始监听连接请求,然后处理下一个连接请求并与客户端建立连接,以便进行数据交换。


参考:
恋恋风辰blog
森明帮大于黑虎帮
哔哩哔哩

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

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

相关文章

Kafka 架构

1 整体架构 1.1 Zookeeper Zookeeper 是一个分布式协调服务&#xff0c;用于管理 Kafka 的元数据。它负责维护 Kafka 集群的配置信息、Broker 列表和分区的 Leader 信息。 Zookeeper 确保了 Kafka 集群的高可用性和可靠性。 但 Zookeeper 已经成为 Kafka 性能瓶颈&#xff0c;…

【Vue】获取模块内的actions方法

目标&#xff1a; 掌握模块中 action 的调用语法 (同理 - 直接类比 mutation 即可) 注意&#xff1a; 默认模块中的 mutation 和 actions 会被挂载到全局&#xff0c;需要开启命名空间&#xff0c;才会挂载到子模块。 调用语法&#xff1a; 直接通过 store 调用 $store.di…

【Linux多线程】线程的终止、等待和分离

文章目录 线程终止正常退出return 退出pthread_exit函数终止线程 pthread_cancel强制终止线程进程终止 线程等待为什么需要等待线程&#xff1f;pthread_join函数 分离线程pthread_detach函数 线程终止 下面给出终止线程的三种方式&#xff1a; 正常退出&#xff1a; 线程执行…

【深度学习】PuLID: Pure and Lightning ID Customization via Contrastive Alignment

论文&#xff1a;https://arxiv.org/abs/2404.16022 代码&#xff1a;https://github.com/ToTheBeginning/PuLID 文章目录 AbstractIntroductionRelated WorkMethods Abstract 我们提出了一种新颖的、无需调整的文本生成图像ID定制方法——Pure and Lightning ID customizatio…

机器学习笔记 - LoRA:大型语言模型的低秩适应

一、简述 1、模型微调 随着大型语言模型 (LLM) 的规模增加到数千亿,对这些模型进行微调成为一项挑战。传统上,要微调模型,我们需要更新所有模型参数。这也称为完全微调 (FFT) 。下图详细概述了此方法的工作原理。 完全微调FFT 的计算成本和资源需求很大,因为更新每…

Vue TypeScript 实战:掌握静态类型编程

title: Vue TypeScript 实战&#xff1a;掌握静态类型编程 date: 2024/6/10 updated: 2024/6/10 excerpt: 这篇文章介绍了如何在TypeScript环境下为Vue.js应用搭建项目结构&#xff0c;包括初始化配置、创建Vue组件、实现状态管理利用Vuex、配置路由以及性能优化的方法&#x…

拐点已至:企业如何借助AI重塑增长?

2024年的激进增长与AI数智化创新并行&#xff0c;传统策略的功效已经减弱。在这篇文章中&#xff0c;我们将展望并深度探索2024年的6大创新增长策略&#xff0c;包括AI驱动的实验&#xff0c;产品再造&#xff0c;超个性化&#xff0c;自动化运营&#xff0c;短视频和KOL营销等…

Kimichat使用案例010:快速识别出图片中的表格保存到Excel

文章目录 一、介绍二、图片信息三、输入内容四、输出内容五、markdown提示词六、markdown输出一、介绍 如果有一张图片格式的表格,想要快速复制到Excel表格中,那么一般要借助于OCR工具。之前试过不少在线OCR工具,识别效果差强人意。其实,kimichat就可以非常好的完成这个任务…

RPA-UiBot6.0数据整理机器人—杂乱数据秒变报表

前言 友友们是否常常因为杂乱的数据而烦恼?数据分类、排序、筛选这些繁琐的任务是否占据了友友们的大部分时间?这篇博客将为友友们带来一个新的解决方案,让我们共同学习如何运用RPA数据整理机器人,实现杂乱数据的快速整理,为你的工作减负增效! 在这里,友友们将了…

【微信小程序开发(从零到一)】——个人中心页面的实战项目(二)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

锂电池寿命预测 | Matlab基于SSA-SVR麻雀优化支持向量回归的锂离子电池剩余寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 【锂电池剩余寿命RUL预测案例】 锂电池寿命预测 | Matlab基于SSA-SVR麻雀优化支持向量回归的锂离子电池剩余寿命预测&#xff08;完整源码和数据&#xff09; 1、提取NASA数据集的电池容量&#xff0c;以历史容量作…

搭建RocketMQ主从异步集群

搭建RocketMQ主从异步集群 1、RocketMQ集群模式 为了追求更好的性能&#xff0c;RocketMQ的最佳实践方式都是在集群模式下完成的。RocketMQ官方提供了三种集群搭建方式&#xff1a; 2主2从异步通信方式&#xff1a;使用异步方式进行主从之间的数据复制。吞吐量大&#xff0c;…

【日常记录】【JS】中文转拼音的库 pinyin-pro

文章目录 1、介绍2、pinyin-pro 基本使用3、参考链接 1、介绍 pinyin-pro 是一个专业的 JavaScript 中文转拼音的库&#xff0c;具备多音字识别准确、体积轻量、性能优异、功能丰富等特点。 常用的案例 搜索功能增强&#xff1a;在输入框输入汉字时&#xff0c;可以转化为拼音输…

YOLOv10 超详细解析 | 网络结构、训练策略、论文解读

网络结构 1. Backbone 2. Head 3. 说明 网络结构按 YOLOv10m 绘制&#xff0c;不同 scale 的模型在结构上略有不同&#xff0c;而不是像 YOLOv8 一样仅调整 depth 和 width。Head 有部分后续计算与 YOLOv8 完全相同&#xff0c;上图省略&#xff0c;具体请看此文。YOLOv10 整…

【Python教程】2-函数、逻辑运算与条件判断

在整理自己的笔记的时候发现了当年学习python时候整理的笔记&#xff0c;稍微整理一下&#xff0c;分享出来&#xff0c;方便记录和查看吧。个人觉得如果想简单了解一名语言或者技术&#xff0c;最简单的方式就是通过菜鸟教程去学习一下。今后会从python开始重新更新&#xff0…

Python基础——字符串

一、Python的字符串简介 Python中的字符串是一种计算机程序中常用的数据类型【可将字符串看作是一个由字母、数字、符号组成的序列容器】&#xff0c;字符串可以用来表示文本数据。 通常使用一对英文的单引号&#xff08;&#xff09;或者双引号&#xff08;"&#xff09;…

计算机网络ppt和课后题总结(下)

常用端口总结 计算机网络中&#xff0c;端口是TCP/IP协议的一部分&#xff0c;用于标识运行在同一台计算机上的不同服务。端口号是一个16位的数字&#xff0c;范围从0到65535。通常&#xff0c;0到1023的端口被称为“熟知端口”或“系统端口”&#xff0c;它们被保留给一些标准…

springboot高校运动会信息管理系统设计与实现-计算机毕业设计源码92968

摘 要 本论文介绍了一个高校运动会信息管理系统的设计和实现过程。首先是高校运动会的需求分析和可行性分析&#xff0c;通过比较运动会的各个工作流程&#xff0c;确定了系统的数据流程和数据库结构&#xff0c;然后介绍了高校运动会信息管理系统开发所使用的软件开发工具&…

Clo3D导出服装动画,使用Unity3D展示

1.前言 Clo3D是一款应用于时装行业的3D服装设计软件,其强大的布料模拟算法可在3D空间中实现设计、制版、试衣和走秀,大幅提升数字作品逼真度和制作效率。为了让服装动画效果展示在Unity3D上模拟效果&#xff0c;需要Clo3D模拟出逼着的衣服动画。总体流程为Clo3D - Mixamo -Blen…

【算法篇】求最长公共前缀JavaScript版本

题目描述 给你一个大小为 n 的字符串数组 strs &#xff0c;其中包含n个字符串 , 编写一个函数来查找字符串数组中的最长公共前缀&#xff0c;返回这个公共前缀。 数据范围&#xff1a; 数据范围:0<n<5000&#xff0c;0<len(strsi)< 5000 进阶:空间复杂度 O(1)&a…