【C++boost::asio网络编程】有关socket的创建和连接的笔记
socket的创建和连接
- tcp客户端创建端点
- tcp服务端创建端点
- 创建socket
- 创建TCP 服务器端的 acceptor 套接字
- 创建 acceptor 套接字并绑定
- 客户端连接到服务器
- 通过ip地址解析
- 通过域名解析
- 服务端接收新连接
tcp客户端创建端点
int client_end_point()
{std::string raw_ip_address = "127.0.0.1";unsigned short prot_num = 8888;boost::system::error_code ec;boost::asio::ip::address ip_address = boost::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();}boost::asio::ip::tcp::endpoint endpoint(ip_address, prot_num);return 0;
}
std::string raw_ip_address
和unsigned short prot_num
分别代表了ip地址和端口号,其中127.0.0.1
为本地回环地址,也叫做localhost
cboost::system::error_code ec
用来表示可能出现的错误。Boost.Asio
使用这个对象来存储错误信息,例如网络操作中可能发生的错误
boost::asio::ip::address ip_address = boost::asio::ip::address::from_string(raw_ip_address, ec);
则是将字符串类型的ip地址解析为boost库中更为通用的boost::asio::ip::address
类型的对象
boost::asio::ip::tcp::endpoint endpoint(ip_address, prot_num);
该语句使用ip_address 和prot_num 创建了一个 TCP 端点(tcp::endpoint
)。端点是网络通信中表示地址和端口的对象,通常用于设置连接目标。ip_address
是通过前面解析得到的 IP 地址。prot_num
是端口号,表示服务监听的端口。
tcp服务端创建端点
int server_end_point()
{unsigned port_num = 8888;//端口号boost::asio::ip::address ip_address = boost::asio::ip::address_v6::any();boost::asio::ip::tcp::endpoint endpoint(ip_address, port_num);return 0;
}
boost::asio::ip::address_v6::any()
是一个特殊的 IPv6 地址,表示任意可用的地址,通常用于服务器端监听所有可用的 IPv6 地址。如果是 IPv4 地址的话,则使用 boost::asio::ip::address_v4::any()
创建socket
int create_tcp_socket()
{boost::asio::io_context ioc;boost::asio::ip::tcp protocol = boost::asio::ip::tcp::v4();boost::system::error_code ec;boost::asio::ip::tcp::socket sock(ioc);sock.open(protocol, ec);if (ec.value() != 0){std::cout<< "Failed to open the socket! Error code = "<< ec.value() << ". Message: " << ec.message();return ec.value();}return 0;
}
boost::asio::io_context
是 Boost.Asio 中用于执行异步操作的核心对象。它是所有异步操作的调度中心,负责调度和执行异步事件
boost::asio::ip::tcp protocol = boost::asio::ip::tcp::v4();
这段代码主要意思是选择TCP协议的版本,当使用tcp::v4()
代表使用的是TCP协议的IPV4版本,如果使用的是tcp::v6()
则代表选择的是IPV6
boost::asio::ip::tcp::socket sock(ioc);
以上代码创建了一个 boost::asio::ip::tcp::socket
类型的套接字对象 sock。该套接字是基于之前创建的 ioc
(io_context)对象进行初始化的。ioc 是 io_context 对象,它在后台驱动异步操作,而套接字则是与网络通信的实体,能够接收和发送数据
sock.open(protocol, ec);
sock.open(protocol, ec)
尝试打开一个 TCP 套接字。这里的 protocol 是之前定义的 IPv4 协议(boost::asio::ip::tcp::v4())
。
如果打开成功,sock 将变为可用状态,允许进行后续的读写操作。如果失败,ec 将保存错误码和错误信息
创建TCP 服务器端的 acceptor 套接字
int create_acceptor_socket()
{boost::asio::io_context ioc;boost::asio::ip::tcp::acceptor acceptor(ioc);boost::asio::ip::tcp protocol = boost::asio::ip::tcp::v4();boost::system::error_code ec;acceptor.open(protocol, ec);if (ec.value() != 0){std::cout << "false" << std::endl;return ec.value();}return 0;
}
boost::asio::ip::tcp::acceptor acceptor(ioc);
boost::asio::ip::tcp::acceptor
是一个用于监听客户端连接请求的对象。在这里,acceptor
对象会依赖于 ioc(io_context)来执行其异步操作。acceptor
的作用是等待客户端发起连接,并接受连接。
boost::asio::ip::tcp protocol = boost::asio::ip::tcp::v4();
boost::asio::ip::tcp::v4()
表示使用 IPv4 协议类型。这里创建了一个表示 IPv4 协议的 protocol 对象。可以理解为告诉 acceptor 套接字它应该使用 IPv4 协议来进行通信。
Boost.Asio 同时支持 IPv4 和 IPv6,这里选择了 v4(),意味着服务器将只监听 IPv4 地址
acceptor.open(protocol, ec);
以上代码 是用来打开 acceptor 套接字的函数。在这里,protocol 参数指定了使用的协议(IPv4),ec 用于捕获错误代码。该操作会尝试在指定协议(IPv4)下打开一个套接字,并让其开始监听传入连接的请求。
如果 acceptor.open() 操作失败,错误信息会被记录在 ec 中。
这段代码并没有绑定 acceptor 到具体的地址和端口。通常情况下,acceptor.open() 之后,还需要通过 acceptor.bind() 或直接在 acceptor 构造函数中指定一个端点(IP 地址和端口)来完成绑定。
还有一种更加方便的方式创建acceptor 套接字
int create_acceptor_socket()
{boost::asio::io_context ioc;boost::asio::ip::tcp::acceptor a(ioc,boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(),8888));
return 0;
}
acceptor
的构造函数接收了两个参数
ioc
:即之前创建的 boost::asio::io_context 对象。acceptor 需要依赖它来执行后续的 I/O 操作。boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 8888)
:这是一个endpoint
对象,表示监听的具体地址和端口
创建 acceptor 套接字并绑定
int bind_acceptor_socket()
{boost::asio::io_context ioc;unsigned short prot_num = 8888;boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address_v4::any(), prot_num);boost::asio::ip::tcp::acceptor a(ioc, ep.protocol());boost::system::error_code ec;a.bind(ep,ec);if (ec.value() != 0) {std::cout << "Failed to bind the acceptor socket."<< "Error code = " << ec.value() << ". Message: "<< ec.message();return ec.value();}return 0;
}
为什么这里没有对acceptor的open操作?
通常情况下,open
操作用来显式地打开一个套接字并指定其协议类型。在之前创建boost::asio::ip::tcp::acceptor
对象时只传递了一格参数ioc而没有指定协议类型(是IPV4还是IPV6?),所以需要手动显示open
,但是这里boost::asio::ip::tcp::acceptor a(ioc, ep.protocol());
创建时传递了协议类型,它就是在构造函数中自动完成open
操作
客户端连接到服务器
通过ip地址解析
int connect_to_end()
{unsigned short prot_num = 8888;std::string ip = "127.0.0.1";try{boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string(ip), prot_num);boost::asio::io_context ioc;boost::asio::ip::tcp::socket sock(ioc, ep.protocol());sock.connect(ep);}catch (const boost::system::system_error& e){std::cout << "Error occured! Error code = " << e.code() << ".Message:" << e.what();return e.code().value();}return 0;
}
通过域名解析
int dns_connect_to_end()
{std::string host = "www.baidu.com";std::string port_num = "8888";boost::asio::io_context ioc;boost::asio::ip::tcp::resolver::query resolver_query(host, port_num, boost::asio::ip::tcp::resolver::query::numeric_service);boost::asio::ip::tcp::resolver resolver(ioc);try{boost::asio::ip::tcp::resolver::iterator it = resolver.resolve(resolver_query);boost::asio::ip::tcp::socket sock(ioc);boost::asio::connect(sock, it);}catch (boost::system::system_error& e){std::cout << "Error occured! Error code = " << e.code() << ".Message:" << e.what() << std::endl;return e.code().value();}return 0;
}
boost::asio::ip::tcp::resolver::query resolver_query(host, port_num, boost::asio::ip::tcp::resolver::query::numeric_service);
这里创建了一个 resolver_query 对象,指定了要解析的域名 host 和端口号 port_num。
boost::asio::ip::tcp::resolver::query
是 Boost.Asio 中用于描述解析查询的类,它包含了域名和端口信息,告诉解析器要解析哪个主机的 IP 地址。
boost::asio::ip::tcp::resolver::query::numeric_service
表示请求解析服务的端口号为数值类型,确保解析器解析的是数字形式的端口号。
boost::asio::ip::tcp::socket sock(ioc);
boost::asio::connect(sock, it);
boost::asio::ip::tcp::socket sock(ioc)
创建了一个 TCP 套接字 sock,并使用 ioc(I/O 服务对象)进行初始化。
boost::asio::connect(sock, it)
尝试连接到解析出来的第一个 IP 地址。这里,it 是从 resolver.resolve() 返回的迭代器,表示解析到的 IP 地址列表。connect 会逐个尝试列表中的 IP 地址,直到找到一个能够成功连接的地址。
服务端接收新连接
int accept_new_connection()
{const int BACKLOG_SIZE = 30;boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address_v4::any(), 8888);boost::asio::io_context ioc;try{boost::asio::ip::tcp::acceptor ac(ioc,ep.protocol());ac.bind(ep);ac.listen(BACKLOG_SIZE);boost::asio::ip::tcp::socket sock(ioc);ac.accept(sock);}catch (boost::system::system_error& e){std::cout << "Error occured! Error code = " << e.code() << ".Message:" << e.what() << std::endl;return e.code().value();}return 0;
}
BACKLOG_SIZE
设置为 30,表示服务器在等待连接时能够排队的最大连接数。这是 TCP 协议栈的一个参数,通常设置为比实际预期连接数稍大的值,防止过多的连接被拒绝。
boost::asio::ip::tcp::socket sock(ioc);
ac.accept(sock);
boost::asio::ip::tcp::socket sock(ioc);
创建一个新的 TCP 套接字 sock,用于与连接的客户端进行通信。这个套接字是通过 ioc(I/O 上下文)初始化的。
ac.accept(sock);
调用 accept() 方法等待接受客户端的连接。当有客户端尝试连接到指定端口时,accept() 会阻塞直到接收到连接请求。成功后,sock 就与客户端建立了连接,并且可以用它来进行数据传输。
相关文章:
【C++boost::asio网络编程】有关socket的创建和连接的笔记
socket的创建和连接 tcp客户端创建端点tcp服务端创建端点创建socket创建TCP 服务器端的 acceptor 套接字创建 acceptor 套接字并绑定客户端连接到服务器通过ip地址解析通过域名解析 服务端接收新连接 tcp客户端创建端点 int client_end_point() {std::string raw_ip_address …...
超级灵感:前端页面功能统一管理方案
前端页面功能统一管理方案 引言 我和朋友聊天想到一个灵感,关于支付状态机管理,这个类可以让我们知道具体上一个状态和下一个状态,这是由于那个事件触发改变,这个功能设计非常好! 从而讨论出为什么我们不能把某一个…...
力扣第 77 题 组合
题目描述 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按任意顺序返回答案。 示例 示例 1 输入: n 4, k 2输出: [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]示例 2 输入: n 1, k …...
(超详细图文)PLSQL Developer 配置连接远程 Oracle 服务
1、下载配置文件 (超详细图文详情)Navicat 配置连接 Oracle-CSDN博客 将下载的文件解压到单独文件夹,如:D:\App\App_Java\Oracle\instantclient-basic-windows.x64-19.25.0.0.0dbru 2、配置 打开 PLSQL Developer,登…...
元器件选型与参数13 电源的分类-线性电源参数 RT9013 AMS1117 PCB布局布线
目录 一、线性电源 1、重要参数 2、线性电源效率一定低吗 3、线性电源并联扩流 4、常见电路 RT9013-LDO AMS1117-xx-LDO 5、布局布线 6、外置输入与电池供电 7、单片机控制其他模组供电实现低功耗 二、开关电源与线性电源配合 1、高效率与低噪声 DC-DC电源大致分为…...
RHEL7+Oracle11.2 RAC集群-多路径(multipath+udev)安装步骤
RHEL7Oracle11.2RAC集群-多路径(multipathudev)安装 配置虚拟存储 使用StarWind Management Console软件,配置存储 dggrid1: 1g*3 Dggrid2: 1g*3 Dgsystem: 5g*1 系统表空间,临时表空间,UNDO,参数文件…...
每日速记10道java面试题03
其他资料 每日速记10道java面试题01-CSDN博客 每日速记10道java面试题02-CSDN博客 目录 一、你使用过java的反射机制吗?如何应用反射? 二、什么是泛型?泛型的作用是什么? 三、java的泛型擦除是什么? 四、Java 中…...
Vue 3 的双向绑定原理
Vue 3 的双向绑定原理是基于 响应式系统 和 数据劫持 技术来实现的。在 Vue 3 中,双向绑定通常是通过 v-model 指令来完成的,它本质上是数据的双向同步:当数据改变时,视图自动更新,反之,视图的修改也会更新…...
如何使用 Chrome 无痕浏览模式访问网站?
无痕浏览(Incognito Mode)是 Google Chrome 浏览器提供的一种隐私保护功能,它允许用户在一个独立的会话中浏览网页,而不会记录用户的浏览历史、下载历史、表单数据等。这对于希望保护个人隐私或进行临时性匿名浏览的用户来说非常有…...
Idea 2024.3 突然出现点击run 运行没有反应,且没有任何提示。
写这篇文章的目的是为了提供一个新的解决思路,因为存在同病不同原因。 如果你进行了1. 检查运行配置 (Run Configuration) 2. 清理和重建项目 3. 清除缓存并重启 IDEA 4.排除kotlin 5.重装idea等等操作之后仍然没有解决,可以试着按一下步骤进行解决。 检…...
【小白学机器学习36】关于独立概率,联合概率,交叉概率,交叉概率和,总概率等 概念辨析的例子
目录 1 先说结论 2 联合概率 3 边缘概率 4 (行/列)边缘概率的和 总概率1 5 条件概率 5.1 条件概率的除法公式 5.2 条件概率和联合概率区别 1 先说结论 关于独立概率,联合概率,交叉概率,交叉概率和,总概率 类型含义 …...
Spring Boot 项目——分层架构
在创建一个 Spring Boot 项目时,为了提高代码的可维护性、可扩展性和清晰度,通常会按照一定的分层架构进行设计。常见的分层架构包括以下几层: 1. Controller 层(Web 层) 作用:接收用户请求,并…...
wordpress网站首页底部栏显示网站备案信息
一、页脚文件footer.php 例如,wordpress主题使用的是simple-life主题,服务器IP为192.168.68.89,在wordpress主题文件中有个页脚文件footer.php,这是一个包含网站页脚代码的文件。 footer.php 路径如下: /www/wwwroot/192.168.68…...
python面向对象编程练习
学生成绩管理系统 定义一个Student类,包括属性(姓名、成绩)和方法(设置成绩、获取成绩、计算平均成绩)。 实例化多个学生对象并调用方法。 功能说明: Student 类: init(self, name):…...
OpenCV_Code_LOG
孔洞填充 void fillHole(const Mat srcBw, Mat &dstBw) {Size m_Size srcBw.size();Mat TempMat::zeros(m_Size.height2,m_Size.width2,srcBw.type());//延展图像srcBw.copyTo(Temp(Range(1, m_Size.height 1), Range(1, m_Size.width 1)));cv::floodFill(Temp, Point(…...
力扣第 74 题是 搜索二维矩阵
题目描述 给定一个 m x n 的矩阵 matrix 和一个目标值 target,请你编写一个函数来判断目标值 target 是否在矩阵中。 每行的元素按升序排列。每列的元素按升序排列。 示例 1 输入: matrix [[1, 4, 7, 11],[2, 5, 8, 12],[3, 6, 9, 16],[10, 13, 14…...
[极客大挑战 2019]BabySQL--详细解析
信息搜集 进入界面: 输入用户名为admin,密码随便输一个: 发现是GET传参,有username和password两个传参点。 我们测试一下password点位能不能注入: 单引号闭合报错,根据报错信息,我们可以判断…...
实现Linux平台自定义协议族
一 简介 我们常常在Linux系统中编写socket接收TCP/UDP协议数据,大家有没有想过它怎么实现的,如果我们要实现socket接收自定义的协议数据又该怎么做呢?带着这个疑问,我们一起往下看吧~~ 二 Linux内核函数简介 在Linux系统中要想…...
RL78/G15 Fast Prototyping Board Arduino IDE 平台开发过程
这是一篇基于RL78/G15 Fast Prototyping Board的Arduino IDE开发记录 RL78/G15 Fast Prototyping Board硬件简介(背景)基础测试(方法说明/操作说明)开发环境搭建(方法说明/操作说明代码结果)Arduino IDE RL…...
YOLOv11 NCNN安卓部署
YOLOv11 NCNN安卓部署 前言 yolov11 NCNN安卓部署 目前的帧率可以稳定在20帧左右,下面是这个项目的github地址:https://github.com/gaoxumustwin/ncnn-android-yolov11 上面的检测精度很低时因为这个模型只训练了5个epoch,使用3090训练一个…...
对载入的3dtiles进行旋转、平移和缩放变换。
使用 params: {tx: 129.75845, //模型中心X轴坐标(经度,单位:十进制度)//小左ty: 46.6839, //模型中心Y轴坐标(纬度,单位:十进制度)//小下tz: 28, //模型中心Z轴坐标(高…...
Rust个人认为将抢占C和C++市场,逐渐成为主流的开发语言
本人使用C开发8年、C#开发15年、中间使用JAVA开发过项目、后期在学习过程中发现了Rust语言说它是最安全的语言,能够解决C、C的痛点、于是抽出一部分时间网上买书,看网上资料进行学习,这一学习起来发现和其它语言比较起来,在编码的…...
在openEuler中使用top命令
在openEuler中使用top命令 概述 top 命令是Linux系统中最常用的实时性能监控工具之一,允许用户查看系统的整体状态,包括CPU使用率、内存使用情况、运行中的进程等。本文档将详细介绍如何在openEuler操作系统中有效利用top命令进行系统监控。 启动top命令 打开终端并输入t…...
探索文件系统,Python os库是你的瑞士军刀
文章目录 探索文件系统,Python os库是你的瑞士军刀第一部分:背景介绍第二部分:os库是什么?第三部分:如何安装os库?第四部分:简单库函数使用方法1. 获取当前工作目录2. 改变当前工作目录3. 列出目…...
【小白学机器学习41】如何从正态分布的总体中去抽样? 获得指定正态分布的样本的2种方法
目录 1 目标:使用2种方法,去从正态分布的总体中去抽样,获得样本 1.1 step1: 首先,逻辑上需要先有符合正态分布的总体population 1.2 从总体中取得样本,模拟抽样的过程 2 从正态分布抽样的方法1 3 从正态分布抽样…...
将VSCode设置成中文语言环境
目录 VSCode默认是英文语言环境,这对于像我这种英语比较菜的人来说不是那么友好 另外也习惯了用中文,所以接下来介绍下如何将VSCode设置成中文语言环境。 1、打开VSCode软件,按快捷键【CtrlShiftP】 2、在弹出的搜索框中输入【configure l…...
Applied Intelligence投稿
一、关于手稿格式: 1、该期刊是一个二区的,模板使用Springer nature格式, 期刊投稿要求,详细期刊投稿指南,大部分按Soringernature模板即可,图片表格声明参考文献命名要求需注意。 2、参考文献ÿ…...
AI-agent矩阵营销:让品牌传播无处不在
矩阵营销是一种通过多平台联动构建品牌影响力的策略,而 AI-agent 技术让这一策略变得更加智能化。AI社媒引流王凭借其矩阵管理功能,帮助品牌在多个平台上实现深度覆盖与精准传播。 1. 矩阵营销的优势 品牌触达更广:多平台联动可以覆盖不同用…...
【0346】Postgres内核 Startup Process 通过 signal 与 postmaster 交互实现 (5)
1. Startup Process 进程 postmaster 初始化过程中, 在进入 ServerLoop() 函数之前,会先通过调用 StartChildProcess() 函数来开启辅助进程,这些进程的目的主要用来完成数据库的 XLOG 相关处理。 如: 核实 pg_wal 和 pg_wal/archive_status 文件是否存在Postgres先前是否发…...
NSSCTF-做题笔记
[羊城杯 2020]easyre 查壳,无壳,64位,ida打开 encode_one encode_tow encode_three 那么我们开始一步一步解密,从最外层开始 def decode_three(encrypted_str):decrypted_str ""for char in encrypted_str:char_code …...
方维网站建设/营销策划的概念
分享讲师:王文广—达观数据副总裁,浙江大学计算机系硕士,在系统架构设计及研发方面有十余年工作经验。讲师简介:曾在百度负责MP3搜索的架构设计和开发,及百度第一版的语音搜索系统和百度音频指纹系统;曾负责…...
培训加盟/seo网络推广机构
9月28日,在上海市经济和信息化委指导下,由上海市黄浦区科学技术委员会、上海市社会信用促进中心、中国人保金融服务有限公司和中国中小企业协会联合主办的“信用大数据创新应用大赛启动仪式”举行。上海市经济和信息化委员会副主任张英通过视频方式为本次…...
网站资料筹备/上海网站推广优化
你是否还在大量控制台窗口中监控容器,还是对使用终端命令充满热情?而使用Docker的图形用户界面(GUI)工具,则可以更简单的对容器进行管理,并提高效率。而且它们都是免费的。PortainerPortainer是一款Web应用…...
php做动态网站/seo搜索引擎优化技术
SQL Server 数据库启动过程,以及启动不起来的各种问题的分析及解决技巧参考文章: (1)SQL Server 数据库启动过程,以及启动不起来的各种问题的分析及解决技巧 (2)https://www.cnblogs.com/VicL…...
企业网站可以免费做吗/汕头网站建设平台
通过虚拟地址访问内存有以下优势: 1 程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。 2 程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小时,内存管理器会将物理内存页(通常…...
wordpress的pingback/公司广告推广方案
[ASP.NET MVC2 系列] [ASP.NET MVC2 系列] ASP.Net MVC教程之《在15分钟内用ASP.Net MVC创建一个电影数据库应用程序》 [ASP.NET MVC2 系列] ASP.Net MVC教程之《ASP.NET MVC 概述》 [ASP.NET MVC2 系列] 理解MVC应用程序的执行过程 [ASP.NET MVC2 系列] ASP…...