网络编程--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.mzph.cn/news/577382.shtml

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

相关文章

解决Qt“报无法定位程序输入点xxx于动态连接库“问题

今天,在使用QtVS2019编译工程时,弹出"无法定位程序输入点xxx于动态链接库"问题,如图(1)所示: 图(1) 报"无法定位程序输入点xxx于动态链接库"问题 出现这种问题的原因有很多: (1) 工程Release/Deb…

Android UID相关知识

一、UID/PID/GID/GIDS的含义和作用 UID : android中uid用于标识一个应用程序,uid在应用安装时被分配,并且在应用存在于手机上期间,都不会改变。一个应用程序只能有一个uid,多个应用可以使用sharedUserId 方式共享同一个uid&#…

Django之按钮(actions)

开篇就是道歉,哈哈哈哈,托更了好久好久,最近太忙了没啥时间更新,各位看官有催更的阔以给我私信哇,希望各位看官给个三连!!!😍😍😍😍 …

【环境配置】虚拟环境配置

创建虚拟环境 conda create -n pytorch python3.9安装成功提示 激活虚拟环境 activate pytorch安装pytorch 查看 python 版本——python 退出 python——exit() 对照 python 与 pytorch 的对应关系 pytorch 地址: https://pytorch.org/get-started/previous-…

docker-compose部署openldap

前段时间在本地搭建了一套gitlab geo测试环境,因为需要集成ldap,所以特意搭建下,特此作为笔记记录下。 文章目录 1. 前置条件2. 编写docker-openldap.yml文件3. 登录4. 使用创建组创建用户登录测试 1. 前置条件 安装docker-compose 安装docke…

OpenEuler安装内网穿透工具实现ssh连接openEuler系统

文章目录 1. 本地SSH连接测试2. openEuler安装Cpolar3. 配置 SSH公网地址4. 公网远程SSH连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 本文主要介绍在openEuler中安装Cpolar内网穿透工具实现远程也可以ssh 连接openEuler系统使用. 欧拉操作系统(openEuler, 简称“欧拉”…

CentOS进入单用户模式

一、重启 二、出现内核选项 按“e” 三、编辑这一行 输入 rw init/sysroot/bin/sh 四、进入单用户模式 ctrlx 进入 五、切换目录 chroot /sysroot 六、然后你就操作你的系统了。 修改密码等等

【adb】--- win10 配置 adb环境 超详细 (持续更新中)

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。 【adb】--- win10 配置 adb环境 超详细 &…

(10)Linux冯诺依曼结构操作系统的再次理解

💭 前言:本章我们首先会明确冯诺依曼体系结构的概念,旨在帮助大家理解体系结构在硬件角度去理解数据流走向的问题。理解完之后我们再去谈操作系统、更多有关操作系统的细节,着重谈谈操作系统概念与定位、操作系统是如何去做管理的…

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

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

【python】python课设 天气预测数据分析及可视化(完整源码)

目录 1. 前言2. 项目结构3. 详细介绍3.1 main.py3.2 GetModel.py3.3 GetData.py3.4 ProcessData.py3.5天气网.html 4. 成果展示 1. 前言 本文介绍了天气预测数据分析及可视化的实现过程使用joblib导入模型和自定义模块GetModel获取模型,输出模型的MAE。使用pyechart…

yolo实现数据增强(数据集不够,快速增加数据集)

目录结构 附上数据增强的全部代码 # -*- codingutf-8 -*-import time import random import copy import cv2 import os import math import numpy as np from skimage.util import random_noise from lxml import etree, objectify import xml.etree.ElementTree as ET imp…

双端队列、优先级队列、阻塞队列

双端队列、优先级队列、阻塞队列 文章目录 双端队列、优先级队列、阻塞队列1 双端队列1.1 概述1.2 应用实例1.2.1 双端链表实现1.2.2 数组实现1.2.3 测试代码 1.3 课后作业- LeeTCode103 2. 优先级队列2.1 概述2.2 基于无序数组实现2.3 基于有序数组实现2.3 堆实现优先级队列2.…

注意力机制(数学公式)

人类视觉注意力机制极大地提高了视觉信息处理的效率与准确性 计算机注意力机制是为了让卷积神经网络注意到他更加需要注意的地方 ,而不是什么都关注 。 分为三种注意力机制,空间注意力机制,通道注意力机制,以及两者的结合。 …

HTTP 原理

HTTP 原理 HTTP 是一个无状态的协议。无状态是指客户机(Web 浏览器)和服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后服务器返回响应(response),连接就被关闭了,在服务器端…

算法基础之最长公共子序列

最长公共子序列 核心思想: 线性dp 集合定义 : f[i][j]存 a[1 ~ i] 和 b[1 ~ j] 的最长公共子序列长度 状态计算: 分为取/不取a[i]/b[j] 共四种情况 其中 中间两种会包含两个都不取的情况(去掉) 但是因为取最大值 有重复也没事用f[i-1][j] 和 f[i][j-1]表…

案例分析:西门子智能工厂

西门子全球首家原生数字化工厂,以其独特的数字化技术,在虚拟世界中构建了工厂的数字孪生,从而实现了从需求分析、规划设计、施工实施到生产运营全过程的数字化。这一原生数字化工厂的创新之处在于,它开创性地运用了原生数字孪生理…

2023年12月25日:串口发出控制命令

代码 uart4.c #include "uart4.h"void uart4_config() {//*****************************************//使能GPIOB|GPIOG|UART4外设时钟RCC->MP_AHB4ENSETR |(0x1<<6);RCC->MP_AHB4ENSETR |(0x1<<1);RCC->MP_APB1ENSETR |(0x1<<16);RCC…

27 redis 的 sentinel 集群

前言 redis 的哨兵的相关业务功能的实现 哨兵的主要作用是 检测 redis 主从集群中的 master 是否挂掉, 单个哨兵节点识别 master 下线为主管下线, 超过 quorum 个 哨兵节点 认为 master 挂掉, 识别为 客观下线 然后做 failover 的相关处理, 重新选举 master 节点 我们这里…

平衡二叉树的构建(递归

目录 1.概念&#xff1a;2.特点&#xff1a;3.构建方法&#xff1a;4.代码&#xff1a;小结&#xff1a; 1.概念&#xff1a; 平衡二叉树&#xff08;Balanced Binary Tree&#xff09;&#xff0c;也称为AVL树&#xff0c;是一种二叉树&#xff0c;它满足每个节点的左子树和右…