网络通信(套接字通信)(C/C++)
1.网络编程必知概念
1.广域网和局域网
广域网:又称外网、公网。是连接不同地区局域网或城域网进行计算机通信的远程公共网络。
局域网:在一定的通信范围内,有很个多计算机组成的私有网络就叫局域网。(这些计算机相互之间是可以通信的,但是不能直接访问外网(可以通过网线或代理服务器就可以访问外网))
2.互联网协议地址(IP)
IP互联网协议地址(Internet Protocol):本质是一个整型数,用于表示计算机在网络中的地址。IP协议版本有两个:IPv4和IPv6
IPv4(Internet Protocol version4):
- 使用一个32位的整型数描述一个IP地址,4个字节,int型
- 也可以使用一个点分十进制字符串描述这个IP地址: 192.168.247.135
- 分成了4份,每份1字节,8bit(char),最大值为 255
- 0.0.0.0 是最小的IP地址
- 255.255.255.255是最大的IP地址
- 按照IPv4协议计算,可以使用的IP地址共有
个
IPv6(Internet Protocol version6):
-
使用一个128位的整型数描述一个IP地址,16个字节
-
也可以使用一个字符串描述这个IP地址:2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b
-
分成了8份,每份2字节,每一部分以16进制的方式表示
-
按照IPv6协议计算,可以使用的IP地址共有
个
3.在不同系统上查看主机对应的ip地址命令
在windows上查看ip的命令:ipconfig
在Linux上查看ip的命令:ifconfig
ping www.baidu.com # 测试是否可用连接外网
ping 局域网ip地址 # 测试是否可用连接局域网
4.端口(port)
端口的作用是定位到主机上的某一个进程,通过这个端口进程就可以接收到对应的网络数据了
比如: 在电脑上运行了微信和QQ, 小明通过客户端给我的的微信发消息, 电脑上的微信就收到了消息, 为什么?
- 运行在电脑上的微信和QQ都绑定了不同的端口
- 通过IP地址可以定位到某一台主机,通过端口就可以定位到主机上的某一个进程
- 通过指定的IP和端口,发送数据的时候对应的端口就能接收到数据了
注意:通过IP地址可以找到一个主机, 通过端口port定位到某一个进程
5.OSI/ISO网络分层模型
应用层 | http ftp KCP MQTT Modbus(各种协议) |
表示层 | 数据加解密 |
会话层 | 进程管理 |
传输层 | 端到端 端口指向具体进程 UDP / TCP |
网络层 | 统一为上层提供同样的身份信息 IP地址 |
数据链路层 | 数据的错误检错 规定身份信息(不同的网络拓扑结构身份信息就不同) |
物理层 | 电气规范 |
6.常用网络通信协议
- TCP协议->传输层协议
- UDP协议->传输层协议
- IP协议->网络层协议
- 以太网协议->网络接口层协议
7.socket编程
socket套接字:一种通用的网络编程接口。
socket 本身是一种进程间通信的方式,最开始可以作为本地的进程之间数据的传输方式。在本地可以通过进程 PID 来唯一标识一个进程,但是在网络中这是行不通的。
而非本地的进程,该怎么标识自己那,就是前面我们说的 IP 地址和端口号了。
8.字节序
字节序,顾名思义字节的顺序,就是大于一个字节类型的数据在内存中的存放顺序,也就是说对于单字符来说是没有字节序问题的,字符串是单字符的集合,因此字符串也没有字节序问题。
数据在计算机主要有两种存储方式大端和小端。
Little-Endian -> 主机字节序 (小端)
- 数据的低位字节存储到内存的低地址位, 数据的高位字节存储到内存的高地址位;
- 我们使用的PC机,数据的存储默认使用的是小端。
Big-Endian -> 网络字节序 (大端)
- 数据据的低位字节存储到内存的高地址位, 数据的高位字节存储到内存的低地址位;
- 套接字通信过程中操作的数据都是大端存储的,包括:接收/发送的数据、IP地址、端口。
9.字节序转换函数
#include <arpa/inet.h>
// u:unsigned
// 16: 16位, 32:32位
// h: host, 主机字节序
// n: net, 网络字节序
// s: short
// l: int// 这套api主要用于 网络通信过程中 IP 和 端口 的 转换
// 将一个短整型从主机字节序 -> 网络字节序
uint16_t htons(uint16_t hostshort);
// 将一个整型从主机字节序 -> 网络字节序
uint32_t htonl(uint32_t hostlong);// 将一个短整型从网络字节序 -> 主机字节序
uint16_t ntohs(uint16_t netshort)
// 将一个整型从网络字节序 -> 主机字节序
uint32_t ntohl(uint32_t netlong);
10.IP地址转换函数
// 主机字节序的IP地址转换为网络字节序
// 主机字节序的IP地址是字符串, 网络字节序IP地址是整形
int inet_pton(int af, const char *src, void *dst);参数:
af: 地址族(IP地址的家族包括ipv4和ipv6)协议
AF_INET: ipv4格式的ip地址
AF_INET6: ipv6格式的ip地址
src: 传入参数, 对应要转换的点分十进制的ip地址: 192.168.1.100
dst: 传出参数, 函数调用完成, 转换得到的大端整型IP被写入到这块内存中
返回值:成功返回1
失败返回0或者-1
#include <arpa/inet.h>
// 将大端的整型数, 转换为小端的点分十进制的IP地址
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);参数:
af: 地址族协议
AF_INET: ipv4格式的ip地址
AF_INET6: ipv6格式的ip地址
src: 传入参数, 这个指针指向的内存中存储了大端的整型IP地址
dst: 传出参数, 存储转换得到的小端的点分十进制的IP地址
size: 修饰dst参数的, 标记dst指向的内存中最多可以存储多少个字节
返回值:成功: 指针指向第三个参数对应的内存地址, 通过返回值也可以直接取出转换得到的IP字符串
失败: NULL
以下两个函数:只能转换ipv4格式的ip地址
// 点分十进制IP -> 大端整型
in_addr_t inet_addr (const char *cp);// 大端整型 -> 点分十进制IP
char* inet_ntoa(struct in_addr in);
2.UDP通信流程
udp是一个无连接的,不可靠的,用户数据报协议,这个协议是一个传输层协议
- 无连接:它仅仅将要发送的数据报传送至网络,并接收从网上传来的数据报,而不与远端的UDP模块建立连接。
- 不可靠:UDP只提供数据的不可靠交付,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份(所以UDP有时候也被认为是不可靠的数据报协议)
- 用户数据报:用户数据报协议将应用程序产生的数据消息转化成数据包,然后经由IP发送,但它并不验证消息是否被正确发送
UDP通信流程图:
3.TCP通信流程
相关文章:

网络通信(套接字通信)(C/C++)
1.网络编程必知概念 1.广域网和局域网 广域网:又称外网、公网。是连接不同地区局域网或城域网进行计算机通信的远程公共网络。 局域网:在一定的通信范围内,有很个多计算机组成的私有网络就叫局域网。(这些计算机相互之间是可以通信的,但是不能直接访问外网(可以通过网线…...

anaconda navigator启动时一直卡在 loading applications 页面
anaconda navigator启动时一直卡在 loading applications 页面 方法1 在安装目录找到D:\anaconda\Lib\site-packages\anaconda_navigator\api 然后打开conda_api.py, 在1358行找到data yaml.load(f),将其改为data yaml.safeload(f) 猜测为保证代码…...

力扣刷题-链表-删除链表的倒数第N个节点
19.删除链表的倒数第N个节点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5] 示例 2:输入:head [1], n 1 输出&…...

Blender DreamUV插件使用简明教程
DreamUV 是一个可让你在Blender的 3D 视口中操纵 UV的工具集合。 该工具集设计用于可重复使用的纹理,例如平铺纹理、装饰表和纹理图集。 其目的是让你无需退出 3D 视图即可对几何体进行纹理处理,从而节省时间并提高灵活性。 1、安装DreamUV 首先下载为…...

AI在线工具分享
1、ChatGPT ChatGPT是一种由OpenAI训练的大型语言模型。它的原理是基于Transformer架构,通过预训练大量文本数据来学习如何生成人类可读的文本,然后通过接受输入并生成输出来实现对话。 ChatGPT的用途非常广泛,可以用于自然语言处理…...
Matlab批量处理测试数据的方法:以VCO的调谐测试曲线处理为例
我们都知道得到的VCO调谐曲线是一根一根扫出来的,如果要手动对数据进行处理很麻烦。 (当然最好是搭建一个自动化测试平台,一边测试一边把数据抓取了,这个以后可以搞一下再更新) 目前还是手动测量的情况下,…...

VScode断点调试vue
VScode断点调试vue 1、修改launch.js文件(没有这个文件就新建)。 {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlin…...
20吨屠宰鸡鸭鹅一体化污水处理设备加工厂家
20吨屠宰鸡鸭鹅一体化污水处理设备加工厂家 溶气气浮机主要构造说明 气浮系统气浮系统集进水、絮凝、分离、集水、出水于一体,与传统气浮设备类似,设有一个稳流室、溶气释放室,使处理性能更稳定,效果更优越。 稳定室:通…...
android被杀以后fragments缓存重建问题和测试方法
这个问题,其实不是太好复现。因为在android的缓存Fragment机制是写在androidx的库中。 主要的原因是android Framework机制: framework at yourpackage.onSaveInstanceState(XXXActivity.kt:118) at android.app.Activity.performSaveInstanceState(A…...

Visual Studio 2017 安装
C自学精简实践教程 目录(必读) 这篇文章会保证你第一次安装VS2017就成功运行Hello World! 下载Visual Studio Installer Gitee 下载 VS2017/vs2017_Community.exe CalmReason/VisualStudio - 码云 - 开源中国 (gitee.com) 百度云下载 链接:https://pan.baidu…...
day5|242.有效的字母异位词、349. 两个数组的交集
242.有效的字母异位词 题目链接:https://leetcode.cn/problems/valid-anagram/ 文章链接:https://programmercarl.com/0242.%E6%9C%89%E6%95%88%E7%9A%84%E5%AD%97%E6%AF%8D%E5%BC%82%E4%BD%8D%E8%AF%8D.html 视频链接:https://www.bilibili.…...

【Python基础】常用模块学习:sys|os|pytest
📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...

【煤矿虚拟仿真体验】VR采煤机技能培训有效提高训练效果
在我们的社会中,能源是至关重要的。它是推动我们日常生活和工作的主要动力。然而,我们在获取这种能源的过程中,也带来了许多环境问题。煤矿开采是其中的一个重要部分,因此我们需要寻找更环保、更安全的方式来进行煤矿开采。VR&…...

渲染路径RenderingPath
文章目录 前言一、什么是渲染路径二、渲染路径有哪些1、前向渲染路径2、延迟渲染路径3、顶点照明渲染路径(已过时)4、旧的渲染路径(已过时) 前言 渲染路径RenderingPath 一、什么是渲染路径 为进行光照计算而设计的渲染方式 二、渲染路径有哪些 1、前向…...
【Java】泛型 之 extends通配符
我们前面已经讲到了泛型的继承关系:Pair<Integer>不是Pair<Number>的子类。 假设我们定义了Pair<T>: public class Pair<T> { ... }然后,我们又针对Pair<Number>类型写了一个静态方法,它接收的参…...

光谱-空间特征分割提取:多光谱图像压缩
Spectral–Spatial Feature Partitioned Extraction Based on CNN for Multispectral Image Compression (基于CNN的光谱-空间特征分割提取多光谱图像压缩) 近年来,多光谱成像技术的迅速发展引起了各领域的高度重视,这就不可避免…...

绝缘子主要尺寸
声明 本文是学习GB-T 1000-2016 高压线路针式瓷绝缘子尺寸与特性. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了高压线路针式瓷绝缘子的结构型式、尺寸、机械特性和电气特性。 本标准适用于标称电压为10 kV 及以下、频率不高于…...
什么是哈希表?如何使用哈希表进行数据存储和查找?
什么是哈希表? 哈希表(Hash Table),也被称为散列表,是一种用于存储键值对数据的数据结构。它是一种非常高效的数据结构,可以实现快速的数据插入、查找和删除操作。哈希表的核心思想是通过将键(…...
脑机接口的发展研究
1.调研对象:智能制造人机交互; 2.作业内容,关于个人所选技术的近期发展(2020-2023年)期间的相关技术问题和研究进展; 3.内容结构,分为摘要介绍(100字以内),近…...

短期光伏发电量短期预测(Python代码,先对异常值处理,再基于XGBoost模型预测)
一.代码流程(运行效果:短期光伏发电量短期预测(Python代码,先对异常值处理,再基于XGBoost模型预测)_哔哩哔哩_bilibili 模型流程: 导入所需的库,包括NumPy、Pandas、Matplotlib、Sea…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...