网络编程--socket编程

news2024/9/24 13:20:34

这里写目录标题

  • 套接字
    • 概念
    • 通信原理
    • 总结
  • 预备知识
    • 网络字节序
      • 简介
      • 字节转换函数
    • 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.coloradmin.cn/o/1335047.html

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

相关文章

如何分析 JVM 内存瓶颈浅谈

背景: 当操作系统内存出现瓶颈时,我们便会重点排查那个应用占用内存过大。对于更深一步分析内存的使用,就进一步去了解内存结构,应用程序使用情况,以及内存如何分配、如何回收,这样你才能更好地确定内存的…

62.乐理基础-打拍子-二八

前置知识:61.乐理基础-打拍子-休止符打法-CSDN博客 通过前置知识,知道了四分音符、二分音符、附点二分音符、全音符以及它们各自对应的休止符拍子的打法,如下图,它们都是最简单的,因为它们都是一拍的整数倍&#xff0…

竞赛保研 基于YOLO实现的口罩佩戴检测 - python opemcv 深度学习

文章目录 0 前言1 课题介绍2 算法原理2.1 算法简介2.2 网络架构 3 关键代码4 数据集4.1 安装4.2 打开4.3 选择yolo标注格式4.4 打标签4.5 保存 5 训练6 实现效果6.1 pyqt实现简单GUI6.3 视频识别效果6.4 摄像头实时识别 7 最后 0 前言 🔥 优质竞赛项目系列&#xf…

山海鲸开发者视角:帮助汽车制造商取得市场优势

山海鲸可视化是一款致力于数字孪生领域的产品,为各行各业提供专业的数据可视化解决方案。作为山海鲸开发者,我们在开发免费好用的数字孪生工具同时也希望能让大家通过多种解决方案了解我们软件的多种可能性,本文就为大家介绍我们的汽车行业解…

JUC并发编程 09——队列同步器AQS

目录 一.Lock接口 1.1Lock的使用 1.2Lock接口提供的 synchronized 不具备的主要特性 1.3Lock接口的所有方法 二.队列同步器(AQS) 2.1队列同步器的接口与示例 2.2AQS实现源码分析 ①同步队列 ②获取锁 ③释放锁 一.Lock接口 说起锁,你肯定会想到 synchron…

MY FILE SERVER: 1

下载地址 https://download.vulnhub.com/myfileserver/My_file_server_1.ova 首先我们需要发现ip 我的kali是59.162所以167就是靶机的 然后我们拿nmap扫一下端口 nmap -sV -p- 192.168.59.167 扫完发现有七个端口开放 按照习惯先看80 没看到有啥有用信息,用nikto扫一下 nik…

中文论文修改和润色哪个好写 papergpt

大家好,今天来聊聊中文论文修改和润色哪个好写,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧,可以借助此类工具: 标题:中文论文修改与润色:哪个更容易写&…

家校互通小程序实战开发01需求分析

目录 1 角色的划分2 用例分析3 创建业务数据源4 创建登录用户数据源总结 最近几年,随着移动互联网的深入发展,我们的日常生活和工作和微信已经紧密绑定。其实,有时候生活和工作的界限已经不明显,在我们的微信好友里既有家人、朋友…

助力打造清洁环境,基于美团最新YOLOv6-4.0开发构建公共场景下垃圾堆放垃圾桶溢出检测识别系统

公共社区环境生活垃圾基本上是我们每个人每天几乎都无法避免的一个问题,公共环境下垃圾投放点都会有固定的值班时间,但是考虑到实际扔垃圾的无规律性,往往会出现在无人值守的时段内垃圾堆放垃圾桶溢出等问题,有些容易扩散的垃圾比…

VMware vcenter6.7安装(基于windows客户端)

一、下载vcenter6.7 1.下载地址,直接复制粘贴到web回车即可,这一步就不截图了。 从官网或者百旺网盘(可以自行搜索,或者私信我要) 二、安装部署vcenter6.7 将下载好的镜像文件拷贝到一台Windows机器上,…

docker-compose 安装Sonar并集成gitlab

文章目录 1. 前置条件2. 编写docker-compose-sonar.yml文件3. 集成 gitlab4. Sonar Login with GitLab 1. 前置条件 安装docker-compose 安装docker 创建容器运行的特有网络 创建挂载目录 2. 编写docker-compose-sonar.yml文件 version: "3" services:sonar-postgre…

智能优化算法应用:基于法医调查算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于法医调查算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于法医调查算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.法医调查算法4.实验参数设定5.算法结果6.…

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

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

Modbus转Profinet网关解决设备通讯不稳的问题

通讯不稳定:表现为数据断断续续,多半是由于线路干扰、接口不匹配、程序不稳定、等原因造成。 解决方案:在原配电柜添加Modbus转Profinet网关(XD-MDPN100/2000)即可解决通迅该问题,Modbus转Profinet网关&…

Python容器类公共操作

运算符 运算符Python 表达式结果描述支持的数据类型[1, 2] [3, 4][1, 2, 3, 4]合并字符串、列表、元组*["Hi!"] * 4[Hi!, Hi!, Hi!, Hi!]重复字符串、列表、元组in3 in (1, 2, 3)True元素是否存在字符串、列表、元组、字典not in4 not in (1, 2, 3)True元素是否不存…

Keil5 5.38官方下载、安装及注册教程(详细版)

一、下载地址 官方C51版本下载地址:https://www.keil.com/demo/eval/c51.htm 官方ARM版本下载地址:https://www.keil.com/demo/eval/arm.htm 注:两个版本的安装教程一样 Keil注册机2032年: 链接:https://pan.baidu.…

iMazing2024免费版iOS移动设备管理软件

以自己的方式管理iPhone,让备受信赖的软件为您传输和保存音乐、消息、文件和数据。安全备份任何 iPhone、iPad 或 iPod touch。iMazing 功能强大、易于使用,称得上是 Mac 和 PC 上最好的 iOS 设备管理器。 正在为iTunes繁琐的操作发愁?设备数…

【序列化和反序列化】

🍁什么是序列化和反序列化? 🍁典型解析🍁拓展知识仓🍁如何进行序列化和反序列化🍁未实现Serializable,可以序列化吗? 🍁典型解析 在Java中,我们可以通过多种方式来创建对…

魔众人才招聘系统全新升级!多城市精准对接,让招聘变得更简单高效!

好消息!魔众人才招聘系统v6.4.0全新版本火热上线!我们致力于为商家和兼职者提供一个更高效、更精准的对接平台。 多城市覆盖:无论您身处哪个城市,魔众都能为您提供丰富的人才资源。一键发布招聘信息,轻松找到心仪的兼…

内存不够用怎么办?三种方法解决!

内存越大,运行越快,程序之间的切换和响应也会更加流畅。但是随着时间的增加,还是堆积了越来越多的各种文件,导致内存不够用,下面就像大家介绍三种好用的清理内存的方法。 方法一:通过电脑系统自带的性能清理…