网络编程--socket编程

这里写目录标题

  • 套接字
    • 概念
    • 通信原理
    • 总结
  • 预备知识
    • 网络字节序
      • 简介
      • 字节转换函数
    • IP地址转换函数
      • 为什么单独列出
      • 函数原型
      • sockaddr结构体
  • 一级目录
    • 二级目录
    • 二级目录
    • 二级目录
  • 一级目录
    • 二级目录
    • 二级目录
    • 二级目录

套接字

概念

在这里插入图片描述
Socket本身有插座的意思,但他是进程之间网络通信的一种特殊文件,本质是缓冲区形成的伪文件,
所以,网络进程之间的数据传递,主要依靠套接字文件

通信原理

在这里插入图片描述
Socket有插头插座的意思,所以,如果想要实现网络进程之间的通信,套接字必须成对出现
在这里插入图片描述
由于套接字是一个特殊的缓存区形成的文件,所以可以使用文件描述符引用套接字,并可以借助文件描述符进行数据的读写操作,实现网络进程之间的数据传输
在这里插入图片描述

总结

在这里插入图片描述

预备知识

网络字节序

简介

在这里插入图片描述
问题产生:计算机本地使用的是小端法进行二进制的存储,即高位高地址,地位低地址。
但是网络流中是使用的大端法,所以要想实现通信的正常进行,就要进行转换

字节转换函数

在这里插入图片描述
htonl 将其拆分进行记忆
例如 htonl 拆分成 h to n l
h是本地,to是到,n是网络,l是long型,表示32位即4字节
所以是本地转向网络,且是long型数据,所以针对的是IP
ntohs 拆分成 n to h s
表示从网络到本地,且是short型,16位2字节,等效于int,所以针对的是端口号(port)
在这里插入图片描述
以从本地到网络为例:如果主机是小端字序,那么函数就发挥了应有的作用,转为大端字序然后返回,如果主机本来就是大端字节序,那么这些函数不做转换,将参数原封不动进行返回,总之函数结果是大端字节序
从网络到本地恰恰相反,函数的结果是小端字节序

IP地址转换函数

为什么单独列出

因为使用上面的字节转换函数,都是参数为整型时才可以使用(long short int都是整型)
而接下来的IP地址转换函数,是直接进行string与整型的转换

函数原型

在这里插入图片描述
在这里插入图片描述
以inet_pton函数为例,因为下划线后面是p to n,所以是本地字节序转网络字节序
函数参数第一个是IP版本,分为IPv4与IPv6,对于这两个选项有两个宏,分别是AF_INEF、AF_INET6
第二个参数传入本地IP地址(形式是点分十进制)
第三个参数是dst指针,利用该参数进行数据的返回,一个指针存储转换完成后的网络字节序类型的IP地址

而函数自己的返回值是int,有三个数1、0、-1,具体含义在上图列出,
所以说 第一个函数有两个返回值,一个是函数自己的返回值,表示状态(是否成功)
另一个是通过指针参数返回,返回具体的网络字节序

第二个函数inet_ntop函数,表示从网络字节序到本地字节序
第一个参数是版本号,第二个参数是网络字节序类型的IP地址,第三个参数是转换完成后的本地字节序(string类型)类型的IP地址,最后一个参数是dst的大小

小tips:在Linux命令行中输入man 函数名
会显示该函数的帮助文档
在这里插入图片描述
在这里插入图片描述

sockaddr结构体

在这里插入图片描述
具体关于sockaddr的解释,在Linux命令行中输入man 7 ip即可查看

sockaddr结构体,是一组数据的集合,现在被优化成了两个版本,分别是sockaddr_in 以及 sockaddr_in6,分别表示IPv4以及IPv6,如下图所示:
在这里插入图片描述
在这里插入图片描述
在之后的许多关键函数中,函数参数都是sockaddr,(如上图所示)但是我们现在都是使用sockaddr_in或者sockaddr_in6,如何解决这个问题呢:
在这里插入图片描述
我们在定义结构体时,就用现在更高级的sockaddr_in类型来定义,例如我们定义的结构体变量是addr
然后我们在向一些原型是sockaddr的函数传参时,将sockaddr_in类型变量的地址进行一个强转,转为 struct sockaddr * 类型,如上图

然而对于sockaddr_in结构体,有如下所示成员
在这里插入图片描述
我们在定义结构体之后,同时要对其成员进行初始化,
第一个成员是sin_family,他是IP版本,赋值为两个版本的宏
第二个成员是sin_port,根据上图的注释可以看出,这个端口号要求是网络字节序的端口号,我们可以使用前面学习的字节转换函数htons(传入本地端口号(整型))
第三个成员是一个结构体in_addr,他里面之后一个成员uint32_t,根据注释,可知他是一个网络字节序的IP地址,对于这一步的初始化,最常用的下图中的【*】语句,即使用一个库宏INADDR_ANY,他表示系统任意一个有效的IP地址,二进制整型,这里就是得到本机的IP地址,所以可以直接传入htonl函数,得到网络字节序的IP地址,赋值给第三个成员
在这里插入图片描述

一级目录

二级目录

二级目录

二级目录

一级目录

二级目录

二级目录

二级目录

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《LIO-SAM阅读笔记》1.IMU预积分模块

前言: LIO-SAM是一个多传感器融合的紧耦合SLAM框架,融合的传感器类型有雷达、IMU和GPS,其中雷达和IMU在LIO-SAM框架中必须使用的。LIO-SAM的优化策略采用了GTSAM库,GTSAM库采用了因子图的优化方法,其提供了一些列C的外…

K8S理论

kubernetes:8个字母省略,就是k8s 自动部署自动扩展和管理容器化部署的应用程序的一个开源系统 k8s是负责自动化运维管理多个容器化程序的集群,是一个功能强大的容器编排工具 分布式和集群化的方式进行容器化管理 版本有1.15 .1.18 .1.20 …

力扣-收集足够苹果的最小花园周长[思维+组合数]

题目链接 题意: 给你一个用无限二维网格表示的花园,每一个 整数坐标处都有一棵苹果树。整数坐标 (i, j) 处的苹果树有 |i| |j| 个苹果。 你将会买下正中心坐标是 (0, 0) 的一块 正方形土地 ,且每条边都与两条坐标轴之一平行。 给你一个整…

【flink番外篇】7、flink的State(Keyed State和operator state)介绍及示例 - 完整版

Flink 系列文章 一、Flink 专栏 Flink 专栏系统介绍某一知识点,并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分,比如术语、架构、编程模型、编程指南、基本的…

dpdk原理概述及核心源码剖析

dpdk原理 1、操作系统、计算机网络诞生已经几十年了,部分功能不再能满足现在的业务需求。如果对操作系统做更改,成本非常高,所以部分问题是在应用层想办法解决的,比如前面介绍的协程、quic等,都是在应用层重新开发的框…

docker 私有仓库

Docker 私有仓库 一、私有仓库搭建 # 1、拉取私有仓库镜像 docker pull registry # 2、启动私有仓库容器 docker run -id --nameregistry -p 5000:5000 registry # 3、打开浏览器 输入地址http://私有仓库服务器ip:5000/v2/_catalog,看到{"repositories&quo…

Linux操作系统——进程(三) 进程优先级

进程优先级 首先呢,我们知道一个进程呢(或者也可以叫做一个任务),它呢有时候要在CPU的运行队列中排队,要么有时候阻塞的时候呢又要在设备的等待队列中排队,其实我们排队的本质就是:确认优先级。…

【数据结构】什么是二叉树?

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 📌二叉树的定义 📌二叉树的特点 📌特殊二叉树 📌二叉树的性质 📌二叉树的存储结构 📌二叉树…

大语言模型说明书

在浩瀚的信息宇宙中,大语言模型如同一颗璀璨的星星正在熠熠生辉。21世纪以来,人工智能可谓是飞速发展,从简单的神经网络到大语言模型、生成式AI,这并非仅仅是一种技术的进步,更是人类智慧的飞跃。大语言模型不仅仅是语…

opencv入门到精通——形态学转换

目录 目标 理论 1. 侵蚀 2. 扩张 3. 开运算 4. 闭运算 5. 形态学梯度 6. 顶帽 7. 黑帽 结构元素 目标 在这一章当中, 我们将学习不同的形态学操作,例如侵蚀,膨胀,开运算,闭运算等。我们将看到不同的功能&…

期末复习【计算机图像处理】

期末复习【计算机图像处理】 前言版权推荐期末复习期末考点内容期末考试题型一、填空 2分*10 概念二、简答 5分*2三、计算 10分*6四、绘图 10分*1 测验二测验三最后 前言 2023-12-25 15:09:07 昨天没有睡好 0点~3点看B站 Google模拟面试 3点~5点没睡着 5~6点睡了一会 6~12点终…

isp代理/双isp代理/数据中心代理的区别?如何选择?

本文我们来详细科普一下几种不同的代理类型:isp代理/双isp代理/数据中心代理,了解他们的区别,选择更适合自己的代理类型。 在讲述这几种代理类型之前,我们先复习一下代理大类有哪几种。 一、机房代理和非机房代理 在做代理ip选…

《试题与研究》期刊发表投稿方式

《试题与研究》杂志是面向全国公开发行的国家CN级权威教育期刊。创刊以来一直以服务教育服务学生为办刊宗旨,以优秀的内容质量和编校质量深受广大读者好评,其权威性、导向性、针对性、实用性在全国教育期刊中独树一帜。为推动教育科研事业的发展&#xf…

20231225使用亿佰特的蓝牙模块dongle协议分析仪E104-2G4U04A抓取BLE广播数据

20231225使用亿佰特的蓝牙模块dongle协议分析仪E104-2G4U04A抓取BLE广播数据 结论:硬件蓝牙分析仪 不一定比 手机端的APK的效果好! 亿佰特E104-2G4U04A需要3片【单通道】,电脑端的UI为全英文的。 BLE-AnalyzerPro WCH升级版BLE-PRO蓝牙分析仪…

DRF视图组件

【1】两个视图基类 APIView APIView是 Django REST Framework 提供的一个基类,用于创建基于函数或基于类的视图。使用 APIView 可以根据需求自定义请求处理逻辑,对于简单的接口逻辑,可以直接继承APIView类。 GenericAPIView GenericAPIVi…

如何使用 YOLOv8 做对象检测

介绍 对象检测是一项计算机视觉任务,涉及识别和定位图像或视频中的对象。它是许多应用的重要组成部分,例如自动驾驶汽车、机器人和视频监控。 多年来,已经开发了许多方法和算法来查找图像中的对象及其位置。卷积神经网络对于此类任务有着非…

Dbeaver如何连接Oceanbase?

Dbeaver & Oceanbase 一、新增驱动二、连接数据库 一、新增驱动 1、新建驱动 点击数据库 -> 驱动管理器 -> 新建 2、设置驱动 驱动名称可随意填写注意驱动类型要是Generichost:port填写实际的host和port 库中新增下载的oceanbase驱动jar包 二、连接数据库 1、找…

linux 系统重启 Redis 服务

先 打开服务器 执行 sudo systemctl stop redis暂停Redis服务 然后 执行 sudo systemctl start redis启动 redis 服务 然后可以执行 sudo systemctl status redis查看 redis 状态

PyAV 使用浅谈

背景: PyAV是一个用于音频和视频处理的Python库,它提供了一个简单而强大的接口,用于解码、编码、处理和分析各种音频和视频格式。PyAV基于FFmpeg多媒体框架,它本质上是FFmpeg 的Python绑定,因此可以利用FFmpeg的功能来…

移动Web

文章目录 移动 Web一、平面转换1. 平移2. 旋转3. 渐变 二、空间转换1. 平移2. 旋转3. 动画 三、移动适配1. 谷歌模拟器2. rem3. less4. vw 四、响应式布局1. 媒体查询2. Bootstrap 移动 Web 一、平面转换 作用:为元素添加动态效果,一般与过渡配合使用 …
最新文章