并发网路通信-套接字通信

套接字通信就是网络通信

在网络通信时,客户端和服务器的比例是N:1

服务器如何处理多个客户端的请求

并发处理方式

1.多线程并发处理->线程池并发处理,线程池可以对多个线程进行管理

2.多进程->进程池

3.io多路转接,使用select或者epoch进行处理,使用io转接函数,可以在单线程的情况下处理多个客户端的请求,如果io转接搭配多线程使用就可以大大提高工作效率

4.使用开源框架:livenent开源的网络通信框架,天然支持高并发

客户端业务流程复杂

需要同时进行软件的上传和下载,在这种情况下就需要和服务器端建立多个连接,这样才能提高效率,就可以在客户端创建一个套接字连接池,每个连接对应一个要处理的业务流程,因为发起了多个连接,每个连接都需要处理,这时候就需要使用多线程,因此套接字连接池和多线程是 搭配使用的,同样的,也可以套接字连接池和线程池搭配使用

由于c++里面没有用于通信的套接字类,需要基于c语言的api封装出对应的用于通信的c++类

1.概念

局域网和广域网

局域网:局域网将一定区域内的各种计算机、外部设备和数据库连接起来形成计算机通信的私有网络。
广域网:又称广域网、外网、公网。是连接不同地区局域网或城域网计算机通信的远程公共网络。


 

ip:网络协议。ip地址用来表示计算机在网络中的地址

端口:用端口来标识进程地址

ip+端口就可以知道是哪台电脑的哪个进程

iso/osi模型

应用层

表示层           应用层

会话层

传输层              传输层                                      tcp,udp  传输层协议

网络层              网络互联层                                ip协议(ipv4,ipv6)

数据链路层               网络接口层                          以太网帧协议(底层协议不需要搞明白,只需要搞明白对应的套接字接口怎么去调用,以及套接字通信的流程)

物理层

物理层:负责最后将信息编码成电流脉冲或其它信号用于网上传输
数据链路层:
数据链路层通过物理网络链路供数据传输。
规定了0和1的分包形式,确定了网络数据包的形式;
网络层
网络层负责在源和终点之间建立连接;
此处需要确定计算机的位置,通过IPv4,IPv6格式的IP地址来找到对应的主机
传输层
传输层向高层提供可靠的端到端的网络数据流服务。
每一个应用程序都会在网卡注册一个端口号,该层就是端口与端口的通信
会话层
会话层建立、管理和终止表示层与实体之间的通信会话;
建立一个连接(自动的手机信息、自动的网络寻址);
表示层:
对应用层数据编码和转化, 确保以一个系统应用层发送的信息 可以被另一个系统应用层识别;


 

网络协议:全世界都认可的在网路通信过程中使用的一种数据的固定通信格式

 数据是怎么在计算机之间进行传递的

我们要发送的数据都是应用层的数据,应用层的数据可以使用应用层的协议(比如ftp,http)进行包装,应用层包装好之后继续向下传递就到了传输层,传输层还需要继续进行打包,打包之后还需要再次向下传递就到了网络层,网络层继续向下传递就到了网络接口层,数据再次打包得到一个报文,这个报文通过网口发送给对方,对方计算机接收到这个数据之后,先对网络接口层的这个数据进行解包操作,解出来后就得到了网络层的一个数据包,网络层继续向上传递就到了传输层,数据在传输层解剖继续向上传递到达应用层,就需要由程序员去处理,先看看我们的数据有没有被应用层的协议进行封装,如果封装了,程序员自己把他解开,比如基于http进行解包才能拿到原始数据。但如果没有使用相关协议对应用层数据进行打包,那么我们从传输层拿到数据就是原始数据了,直接处理就可以了

应用层以下,程序员默认情况下不需要做任何处理的,这些都是由内核来完成的,我们只需要把应用层这个数据搞清楚就行了

应用层数据就两种情况:1.不进行数据的打包

2.打包的数据 如果说对应用层的数据进行了封装,接收到这个数据之后需要在应用层把这个数据按照发送端的协议格式再解开就能得到原始数据

在网络通信的时候, 程序猿需要负责的应用层数据的处理(最上层)

应用层的数据可以使用某些协议进行封装, 也可以不封装

程序猿需要调用发送数据的接口函数,将数据发送出去

程序猿调用的API做底层数据处理

传输层使用传输层协议打包数据
网络层使用网络层协议打包数据
网络接口层使用网络接口层协议打包数据
数据被发送到internet
接收端接收到发送端的数据

程序猿调用接收数据的函数接收数据
调用的API做相关的底层处理:
网络接口层拆包 ==> 网络层的包
网络层拆包 ==> 网络层的包
传输层拆包 ==> 传输层数据
如果应用层也 使用了协议对数据进行了封装,数据的包的解析需要程序猿做

套接字通信就是网络通信就是socket通信

socket:研发的一套接口

问题:在发送端把数据封装好后,肯定要把它先存到一块内存中,然后再通过网络进行发送,接收端收到这个数据后,也是要先把数据存到一块内存中,然后再进行解析

如果发送端A和接收端B在内存中存储数据的顺序不一致(比如发送端从低地址位到高地址位存储123456,而接收端可能是654321这样),就会导致在接收端解析不出来发送端相同的数据

所以必须要求两段在内存中处理数据的顺序是一致的,即要制定一个规则,即指定数据在发送过程中的字节序(即数据在内存中的存储顺序)

字节序,顾名思义字节的顺序,就是大于一个字节类型的数据在内存中的存放顺序,也就是说对于单字符来说是没有字节序问题的,字符串是单字符的集合,因此字符串也没有字节序问题。

对于int long这些非单字节结构的数据类型,它们都需要由多个字节才能够组成一个完整的整体

数据在内存中的存储顺序主要有两种,分别是大端(网络字节序)和小端(主机字节序),通常所用的pc机在内存中的存储顺序,就是按照小端的顺序存储的,在进行网络通信的时候,数据是按照大端来存储的,比如在套接字通信的时候发送的数据需要把数据从小端转换成大端进行发送,接收到数据之后,还需要把大端转换成小端在本地主机上进行存储

小端(主机字节序):数据的低位字节存储到低地址位,高位字节存储到高地址位(低低高高)

大端(网络字节序):相反(低高高低)

大小端相互转换的操作函数

#include <arpa/inet.h>
// u:unsigned
// 16: 16位, 32:32位
// h: host, 主机字节序
// n: net, 网络字节序
// s: short
// l: int
//这组函数主要是对16位和32位的整形数进行转换
// 这套api主要用于 网络通信过程中 IP 和 端口 的 转换
// 将一个短整形从主机字节序 -> 网络字节序
uint16_t htons(uint16_t hostshort);	
// 将一个整形从主机字节序 -> 网络字节序
uint32_t htonl(uint32_t hostlong);	// 将一个短整形从网络字节序 -> 主机字节序
uint16_t ntohs(uint16

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

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

相关文章

AI当前状态:有哪些新技术

一、到目前为址AI领域出现的新技术 到目前为止&#xff0c;AI领域涌现了许多令人兴奋的新技术。以下是一些关键的进展&#xff0c;涵盖了从基础模型到实际应用的多个方面&#xff1a; 1. 更强大的大型语言模型 (LLMs): 性能提升: 新一代LLM&#xff0c;例如OpenAI的GPT-4o和…

AI与IT的共生

AI并非“职业终结者”&#xff0c;而是IT从业者的“认知杠杆”。通过工具化协作、技能升级与伦理治理&#xff0c;人类可释放创造力&#xff0c;探索量子计算、生物启发算法等深水区。未来的IT行业将呈现“AI赋能人类&#xff0c;人类定义AI边界”的共生格局。 一、AI如何改变…

swagger的简介及使用方法

Swagger 是一个用于描述、生成、文档化和测试 RESTful API 的开源工具集。它可以自动生成 API 文档&#xff0c;帮助开发者理解和使用 API。Swagger 由 Swagger.io 提供&#xff0c;并已经发展成了一套广泛应用于 API 设计和文档的标准。 Swagger 项目的历史可以追溯到 2010 年…

解决Flutter 2.10.5在升级Xcode 16后的各种报错

Flutter 环境 Flutter version 2.10.5Dart version 2.16.2DevTools version 2.9.2CocoaPods version 1.16.2Xcode 16.3 问题一&#xff1a;XCResult parsing error: Error: This command is deprecated and will be removed in a future release, --legacy flag is required t…

Vue + Spring Boot 整合全解析

一、引言 在当今的Web开发领域&#xff0c;前后端分离架构已成为主流。Vue.js作为一款流行的前端框架&#xff0c;以其简洁易用和高效的特点深受开发者喜爱&#xff1b;Spring Boot则是Java后端开发中快速构建应用的利器。将Vue和Spring Boot整合&#xff0c;能够充分发挥两者…

PDF.js 生态中如何处理“添加注释\添加批注”以及 annotations.contents 属性

我们来详细解释一下在 PDF.js 生态中如何处理“添加注释”以及 annotations.contents 属性。 核心要点&#xff1a;PDF.js 本身主要是阅读器&#xff0c;不是编辑器 首先&#xff0c;最重要的一点是&#xff1a;PDF.js 的核心库 (pdfjs-dist) 主要设计用于解析和渲染&#xf…

当HTTP遇到SQL注入:Java开发者的攻防实战手册

一、从HTTP请求到数据库查询:漏洞如何产生? 危险的参数拼接:Servlet中的经典错误 漏洞代码重现: public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String category = request.getParameter("…

【grafana原生告警中心配置飞书机器人告警】

在grafana中的connect point中使用webhook的方式推送到飞书&#xff0c;始终无法触发告警&#xff0c;原因是grafana推送的格式飞书不识别&#xff0c;现有两种方式 1.使用中转服务 使用flask搭建一个服务&#xff0c;grafana告警先通过webhook发送到web服务中&#xff0c;格…

kafka集群认证

1、安装Kerberos(10.10.10.168) yum install krb5-server krb5-workstation krb5-libs -y ​ 查看版本 klist -V ​ Kerberos 5 version 1.20.1 ​ 编辑/etc/hosts 10.10.10.168 ms1 10.10.10.150 ms2 10.10.10.110 ms3 vim /etc/krb5.conf # Configuration snippets ma…

前端工程化之自动化测试

自动化测试 自动化测试为什么需要测试&#xff1f;什么时候需要考虑测试测试类型前端测试框架单元测试Jest 重点掌握项目示例package.jsonsrc/utils/math.tssrc/utils/math.test.ts进行测试jest.config.js覆盖率直观看覆盖率coverage/lcov-report/index.html src/main.test.tst…

分布式系统核心原理

CAP定理与权衡实践 CAP定理 一致性&#xff08;Consistency&#xff09; 强一致性&#xff1a;所有读写操作均基于最新数据&#xff08;如银行转账&#xff09;。 最终一致性&#xff1a;数据副本经过一段时间后达到一致&#xff08;如社交媒体的点赞数&#xff09;。 技术实现…

Step文件无法编辑怎么办?

Step文件无法编辑怎么办&#xff1f; 这里介绍两种方法&#xff0c; 1、 直接导入 准备step文件&#xff0c;solidworks导入后是这样&#xff0c;不能在上面直接编辑 图 1 点击右键&#xff0c;选择解除特征&#xff08;不同版本的可能不太一样&#xff0c;这里是solidworks2…

TIM_ITConfig() 和 TIM_Cmd()

在STM32的定时器中断配置中&#xff0c;TIM_ITConfig() 和 TIM_Cmd() 是两个关键函数&#xff0c;它们分别控制中断使能和定时器计数器的启停&#xff0c;作用层级不同。以下是详细解释&#xff1a; 1. TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE) 作用 启用定时器的特定中断…

TensorFlow 实现 Mixture Density Network (MDN) 的完整说明

本文档详细解释了一段使用 TensorFlow 构建和训练混合密度网络&#xff08;Mixture Density Network, MDN&#xff09;的代码&#xff0c;涵盖数据生成、模型构建、自定义损失函数与预测可视化等各个环节。 1. 导入库与设置超参数 import numpy as np import tensorflow as t…

数据结构实验7.2:二叉树的基本运算

文章目录 一&#xff0c;实验目的二&#xff0c;问题描述三&#xff0c;基本要求四&#xff0c;实验操作五&#xff0c;示例代码六&#xff0c;运行效果 一&#xff0c;实验目的 深入理解树与二叉树的基本概念&#xff0c;包括节点、度、层次、深度等&#xff0c;清晰区分二叉…

直线轴承常规分类知多少?

直线轴承的分类方式多样&#xff0c;以下是从材质、结构形状和常规系列三个维度进行的具体分类&#xff1a; 按主要材质分类 外壳材质&#xff1a;常见的有不锈钢&#xff0c;具有良好的耐腐蚀性&#xff0c;适用于一些对环境要求较高、易受腐蚀的工作场景&#xff1b;轴承…

websocket和SSE学习记录

websocket学习记录 websocket使用场景 即时聊天在线文档协同编辑实施地图位置 从开发角度来学习websocket开发 即使通信项目 通过node建立简单的后端接口,利用fs&#xff0c; path&#xff0c; express app.get(*, (req, res) > {const assetsType req.url.split(/)[…

CUDA编程中影响性能的小细节总结

一、内存访问优化 合并内存访问&#xff1a;确保相邻线程访问连续内存地址&#xff08;全局内存对齐访问&#xff09;。优先使用共享内存&#xff08;Shared Memory&#xff09;减少全局内存访问。避免共享内存的Bank Conflict&#xff08;例如&#xff0c;使用padding或调整访…

【双指针】对撞指针 快慢指针 移动零

文章目录 双指针介绍对撞指针快慢指针283. 移动零解题思路算法思路算法流程双指针介绍 ​ 算法中的双指针,并不一定是指我们平常在 c/c++ 使用的指针类型,更多时候其实是数组的下标等,因为它们也是有标识某个元素的功能,通常我们也就顺其自然地称其为 “指针” ! ​ 常见…

数据结构0基础学习堆

文章目录 简介公式建立堆函数解释 堆排序O(n logn)topk问题 简介 堆是一种重要的数据结构&#xff0c;是一种完全二叉树&#xff0c;&#xff08;二叉树的内容后面会出&#xff09;&#xff0c; 堆分为大小堆&#xff0c;大堆&#xff0c;左右结点都小于根节点&#xff0c;&am…