当前位置: 首页 > news >正文

学习网络编程No.3【socket理论实战】

引言:

北京时间:2023/8/12/15:32,自前天晚上更新完文章,看了一下鹅厂新出的《扫毒3》摆烂至现在,不知道是长大了,还是近年港片就那样,给我的感觉不是很好,也可能是国内市场对港片不大友好,反正质量不怎么高。然后昨天大部分时间花在了追《我欲封天》这本小说,主要是情节比较耐人寻味,另人欲罢不能!耳根不愧是经典的代名词。再后来到了晚上刷了会视屏,先是看了《饥饿站台》的剪辑,然后又看了一下《饥饿游戏》的剪辑,这种视屏真的是划不走,也是令人欲罢不能,哎!然后刚午睡醒来,为了今天能够更文,现在必须要豁出去了,虽然娱乐了挺久,但是没有关系,就当是对前几天疯狂码字的奖励吧!今天就让我们重拾键盘来一个疯狂星期六吧!该篇博客让我们来学习一下有关套接字(socket)的相关知识吧!

在这里插入图片描述

深入学习网络传输基本流程

在上篇博客中,我们重点对网络协议栈中的网络层和数据链路层进行了详解,明白了为什么说路由器和交换机工作于网络层和数据链路层,并且对于IP地址和MAC地址以及数据传输有了一定的认识,所以此时我们再来谈谈相关知识。

回顾封装、解包和分用
在上篇博客中,我们重点讲解了有关网络传输的基本流程,明白当一个数据想要从主机A发送到主机B,因为网络协议栈每一层都有与其对应的协议和需要实现的功能,所以我们需要在数据经过网络协议栈时,将每一层特定的协议封装到数据中,其中就包括报头协议、识别协议和功能协议,所以只有对每一层特定的协议进行了封装,最后在数据向下传递或者向上传递时,才能正确的按照顺序传到每一层协议,并且正确的被每一层协议识别,然后完成在该层协议中对应需要实现的功能,当然这也就是解包和分用的概念,并且注意,当数据在传输层时我们称为报文,在网络层称为数据报,在数据链路层称为数据包,在物理层则称为数据帧。

深入理解MAC地址和IP地址
在上篇博客有关数据链路层和网络层中,我们简单理解了一下MAC地址和IP地址,明白MAC地址是当数据在局域网中传输,交换机对于某网卡的唯一标识符,而IP地址是对于广域网中进行数据传输,路由器对于某主机的唯一标识符。并且明白,因为主机的IP地址是通过路由器向网络中的DHCP协议申请,所以对应路由器的路由表中天生就记录了该主机的IP地址,也就是在广域网中当某个其它主机想要发送数据给目标主机时,只要让与其对应的路由器根据路由表中对应其它路由器的IP地址找到目标路由器就等于是找到了目标主机,当找到目标路由器并且将数据发送之后,注意:虽然目标路由器的路由表中就有对应主机的IP地址,但是IP地址只是起一种标识作用,并不能直接接收数据(只有网卡,也就是MAC地址才具有接收数据的功能),所以此时最关键的问题就是要让路由器获取到目标主机的MAC地址,那么问题就来了路由器如何获取到目标主机的MAC地址呢?首先明白,此时需要分为两种情况,一种是路由器与目标主机之间存在直接联系,另一种是目标主机和路由器之间不存在直接联系,什么意思呢?也就是需要判断该主机是否在路由器的子网中(类比学校主机和自己的笔记本电脑),当我们的笔记本电脑使用WIFI时,此时就表示该主机与路由器之间存在联系,反之学校机房的电脑与路由器不存在联系(是否获取到路由器本身提供的IP地址接口)。情况一:也就是存在联系,那么路由器和目标主机之间就可以直接通过路由器提供的IP地址接口进行交互(同理目标主机获取自己的IP地址),直接将自己的MAC地址告诉路由器,最后路由器直接根据自己的转发表和交互接口将需要传送的数据全部传给目标主机。情况二:反之,路由器和目标主机之间不存在联系,那么此时同理路由器需要先将数据交给交换机,然后通过交换机传送给目标主机,但是,此时同理有一个问题,也就是路由器如何找到交换机呢?同理路由器需要根据自己转发表中目标主机的MAC地址和交换机之间的关系来确定将数据传送给那一个交换机,也就是同理此时路由器需要获取到目标主机的MAC地址,问题也就来了,在路由器和目标主机不存在直接关系的情况下,路由器如何获取到MAC地址?答案是:此时涉及到一个叫ARP的网络协议,很好理解,也就是当某路由器获取到了目标主机的IP地址后,根据ARP网络协议,此时路由器会进行ARP广播,也就是将目标主机的IP地址通过交换机发送给所有与交换机连接的主机,当目标主机发现自己的IP地址与接收到的IP地址相同时,此时目标主机就会进行ARP响应操作,也就是将自己的MAC地址发送给路由器,此时路由器就成功的获取到了目标主机的MAC地址,这也就是ARP网络协议。当我们通过该方法让路由器获取到了目标主机的MAC地址,本质也就是让IP地址的标识作用变得更加实质性(IP地址->MAC地址)之后,此时路由器就可以根据转发表中MAC地址与交换机之间的关系,找到与目标主机关联的目标交换机,从而实现将数据从路由器交给交换机再给网卡。注意:虽然此时路由器也获取到了MAC地址,但是因为路由器和目标主机之间并不存在关系,所以不能直接传送数据,必须经过交换机,与上述情况一有一定区别。明白了这些之后,此时我们对MAC地址和IP地址以及数据传输过程中的细节知识就有了更深的理解,下面我们一起看副图来具体理解一下广域网中(IP地址)数据的传输过程(结合封装和分用理解),如下图所示:
在这里插入图片描述
如上图所示,与局域网中的数据传输过程不同,此时在广域网中IP地址是必不可少的部分,结合之前有关封装、解包和分用的知识以及数据链路层的知识,此时我们就可以更加深入的理解为什么数据链路层可以支持多种不同的协议,本质如上图就是因为在数据传输的过程中,每一层协议想要被识别就需要有对应的报头,当我们在发送数据时,在数据链路层是根据以太网协议来封装数据包,那么交换机想要再将数据传送给路由器,那么前提就是它根据以太网协议完成了以太网协议的解包过程,解包完成之后再根据协议进行分用,此时就可以成功的将数据包传送给路由器,此时路由器再经过一些列的查询路由表过程,找到含有目标IP地址的路由器,最后同理当我们想要将数据从路由器传送给目标交换机时,此时就一定需要对目标交换机使用的协议进行封装(以太网协议、令牌环协议、无线LAN协议),只有这样才能使交换机正常工作,所以依据这一原理(封装、分用、解包)就可以很好的解决数据链路层协议不一致问题,当然为什么不一致在上篇博客谈TCP/IP协议栈时,我们有重点强调。所以这也就是为什么网络层和传输层的IP协议以及TCP协议保持一致时,数据链路层可以不保持一致的原因。

注意: 明白上述知识,再加上上述对IP地址和MAC地址的深入理解,此时我们再明白最后一点之后,就可以说是无敌的存在了,也就是为什么说源IP地址和目标IP地址不变,而MAC地址在变,搞明白这个点,就会有一种守得云开见月明的感觉,在上述我们明白了一个很重要的概念:也就是IP地址就是一种标识,MAC地址才是实质性的,原因就在于MAC地址代表的是网卡,只有网卡才具有传输和接收数据的能力,也就是说在广域网中,路由器查询路由表寻找目标IP的过程本质是一个寻找MAC地址的过程,也就是当一个路由器想要将数据传输给下一个路由器(简称:下一跳),这个过程同理我们上述所说路由器如何获取MAC地址,也就是路由器无论是否找到目标路由器,它想要完成下一跳,在第一次时,它一定需要进行一次ARP广播(同理上述所说),然后某个路由器发现它的路由表中存在目标IP地址,那么它就进行ARP响应,将自己的MAC地址发送给对应路由器,最终同理路由器获取到了目标路由器的MAC地址,然后根据该目标MAC地址将数据传送给目标路由器(并且记录IP地址和MAC地址间的映射关系,记录之后下一次传输时,就可以直接找到MAC地址,也就是不需要再进行ARP广播),接下来的过程统统同理。明白这点之后,小小的数据传输过程如砍瓜切菜一般,概念我们就彻底搞定。如下图所示,就是我们云服务器上的IP地址和MAC地址:

在这里插入图片描述

什么是套接字(socket)

明白了上述知识,此时我们正式来看一看该篇博客的主题,有关套接字相关的知识,莫慌,我一直强调,想要理解一个陌生的东西,最好的方式就是类比学过的知识,首先明白套接字是在网络协议栈中传输层使用TCP/UDP协议实现的一种网络通信方式,也就是操作系统在传输层提供了一套接口(套接字)供给我们使用,让我们可以实现网络通信(系统调用)。然后因为网络通信的本质是进程间通信,所以套接字和消息队列、共享内存、管道一样,都是一种进程间通信方式,只不过前者不仅可以在系统内部实现进程间通信(本地套接字),也可以实现网络通信(网络套接字),而后者只能用于进程间通信,当然具体为什么网络通信的本质是进程间通信,下述我们详解讲解。

从网络数据传输看套接字
对于上述套接字的关键概念有了一定理解之后,此时我们从套接字是一种网络通信,而网络通信是一种进程间通信来深入理解一下有关套接字的知识。首先,此时我们对网络数据传输过程已经如火纯情,对于数据从主机A到主机B的过程了如指掌,那么明白数据从A到B不是我们的目的,我们的目的是让主机B在接收到数据之后可以去访问某种服务,然后将对应的服务返回给主机A,并且根据网络协议栈的知识,我们知道这个申请服务和访问服务的过程一定是在应用层实现,所以此时就有了客户端和服务端(服务器)的概念,也就是两个主机之间的网络间通信本质就是客户端(APP)和服务端(该APP的功能实现)之间的通信,明白了这点之后,此时对于网络通信就是进程间通信的概念可以说是更加明了了,但还不够,我们还可以知道,当我们需要通过某个客户端(APP)去获取某个功能时,这个操作是随时随地都能完成的,这也就说明我们访问的服务一定是被启动,并且一直处于运行状态的,所以明白了这两点,我们就可以把客户端和服务端理解成两个进程,当我们访问某个客户端(APP)就是在启动某个进程,而服务端进程是一个被启动的死循环进程。总而言之:网络通信就是进程间通信。

深入理解网络通信
明白了上述知识,对于套接字就是一种网络间通信,一种进程间通信的概念我们已然耳聪目明,呼之欲出,此时对于数据从主机A到主机B的过程我们就可以深入理解为主机A创建一个进程(应用层打开APP),然后该进程执行相应的代码(创建套接字等),再根据TCP/UDP协议以及套接字(与主机B建立联系),此时数据就被传送到主机B,然后主机B经过物理层、数据链路层、网络层到达传输层,在传输层上套接字就可以将对应的数据推送给上层指定的进程。

此时对于上述这段话我们还不能很好理解,当然有关数据在网络层封装IP地址以及路由器、交换机相关的知识我们不再强调,此时我们需要搞定的问题是:套接字如何将数据推送给上层指定的进程以及套接字的本质是什么?第一个问题:也就是在系统中有那么多的进程,套接字如何找到目标进程呢?明白,同理IP地址,当某主机想要实现网络通信,那么前提就一定是它获取到了目标主机的IP以及目标进程的标识,因为网络通信的本质就是进程间通信,所以此时只要对某主机和某进程进行的标识,那么在整个互联网中,我们就能找到那个唯一的服务端进程,从而顺利完成两个进程间的通信。明白这点,端口号的概念油然而生,端口号就是用来标识那个网络中唯一的进程,所以对于使用源IP、源端口号、目标IP、目标端口号实现的进程间通信方式,我们就称为套接字(socket)网络通信。所以也就是套接字可以直接根据端口号找到目标进程,然后将对应数据拷贝到该进程的缓冲区中,注意:操作系统内部存在许多进程标识符(PID)用于管理进程,但是在网络通信中想要识别一个进程我们只使用端口号,这样可以降低进程管理模块和网络模块之间的耦合。

深入理解接收和发送数据
搞定了上述知识,此时我们对网络通信有了更深的认识,明白网络通信就是进程间通信,明白进程间通信需要使用目标IP和目标端口号来标识两个唯一的进程,明白socket通信方式,当然具体socket如何实现这种通信方式,下述和下一篇博客我们详谈,本质就是各种socket接口的使用,所以socket网络通信本质其实也叫socket编程接口。搞定这些之后,此时我们来看看有关网络通信的最后一个知识点,进程接收和发送数据的具体过程: 首先是接收,在之前我们将网络协议栈与操作系统结合那块知识我们谈到过网络协议栈是和文件系统有关的,这块知识充分体现,也就是目标进程启动时,用户可以在该进程中打开一个文件,文件被打开之后,根据文件系统的知识,此时操作系统就会为其创建struct file结构体,其中就包含了该文件的inode和缓冲区等信息,然后当目标进程对应的套接字接收到数据之后,此时该套接字就会根据TCP协议和有效载荷(数据)找到目标进程的端口号,然后该套接字根据目标进程对应打开文件的文件描述符找到被打开文件,最终将自己缓冲区中的数据拷贝到该文件缓冲区中。其次是发送:同理,创建进程(启动APP),在该进程中打开文件,将数据写入到该文件的缓冲区中,再经过操作系统将该缓冲区中的数据拷贝到与该进程对应的套接字缓冲区中,然后套接字经过网络协议栈将数据发送给目标主机。通过上述方式,进程就可以很好的实现如何凭借文件进行网络数据的接收和发送。

认识TCP协议和UDP协议

明白了上述有关socket网络通信的知识,此时我们来简单认识一下TCP和UDP协议,因为这两种协议都是传输层协议,且套接字(socket)就是工作在传输层,简而言之也就是我们可以利用不同的协议来实现socket网络通信,下述就是有关TCP和UDP之间的特点,也就是不同,如下所述:

1.TCP
TCP协议是一种传输层协议,也叫作传输控制协议,是一种面向连接、面向字节流的可靠性协议,怎么理解呢?面向连接也就是说在数据发送之前,发送方和接收方需要提前建立一个联系,而面向字节流指的是该协议对于数据的读取/发送没有控制,想读/发多少就读多少,而可靠性表示的是使用TCP协议该协议就会保证对应的数据被接收方接收,如果中途失败,那么TCP协议就会进行重传等操作,反正就是通过各种手段来确保数据传输成功(数据分段、流量控制、拥塞机制等)。

2.UDP
同理UDP协议也是一种传输层协议,也叫作用户数据报协议,是一种无连接、面向数据报等待不可靠协议,同理TCP理解,此时对于UDP的理解就比较简单,UDP协议在发送数据之前不需要建立发送方和接收方的联系,并且在读取/发送数据时必须完整的读取/发送,而不可靠性表示的也就是发送方将数据发送之后,不再关心接收方是否接收到数据。

总结来说:TCP适用于对数据传输可靠性要求较高的场景,而UDP适用于对实时性要求较高、对数据传输可靠性要求较低的场景。【想要进一步理解可参考该链接:深入学习TCP/UDP】

网络字节序

认识了TCP和UDP之后,此时我们对于socket编程就又进了一步,以后我们肯定会对TCP和UDP协议各自的特点进行区分,然后实现不同的socket网络通信,也就是TCP网络通信和UDP网络通信,不过在此之前我们需要理解一下网络字节序相关的知识,该知识本质是为了解决有关数据使用大端存储还是小端存储的问题,如下图所示:

在这里插入图片描述
如上图所示,此时我们明白,在计算机中进行多字节存储的时候,由于体系结构的原因,此时不仅支持大端存储,也支持小端存储,所以如果一台大端存储的机器和一台小端存储的机器之间进行网络通信,那么此时就会出现数据被反向存储的问题,最终影响数据正确性,所以为了解决该问题,此时就提出了网络字节序的概念,规定网络字节序列必须是大端,所以在网络中获取到的数据就一定是大端存储,也就是如果发送方是一个小端存储机器,那么它在网络通信数据传输时,就需要将数据从小端转换成大端,同理接收方如果也是小端,那么它在接收数据时,就需要将数据从大端转换成小端,这也就是网络字节序的概念。

注意: 如果我们的主机也是小端,那么我们在用户层编写代码时,也需要完成小端转大端的工作,所以此时操作系统为我们提供了一些接口,其中包括:htonl、ntohl(32位)/htons、ntohs(16位)(主机->网络/网络->主机),具体使用以后详谈。

认识socket编程接口

功能对应接口
创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)int socket(int domain, int type, int protocol);
绑定端口号 (TCP/UDP, 服务器)int bind(int socket, const struct sockaddr *address, socklen_t address_len);
开始监听socket (TCP, 服务器)int listen(int socket, int backlog);
接收请求 (TCP, 服务器)int accept(int socket, struct sockaddr* address, socklen_t* address_len);
建立连接 (TCP, 客户端)int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

(上述接口下篇博客我们重点介绍以及使用)

总结:socket相关知识今天我们就介绍到这,具体有关socket编程有待下篇博客见,See you!

相关文章:

学习网络编程No.3【socket理论实战】

引言: 北京时间:2023/8/12/15:32,自前天晚上更新完文章,看了一下鹅厂新出的《扫毒3》摆烂至现在,不知道是长大了,还是近年港片就那样,给我的感觉不是很好,也可能是国内市场对港片不…...

Linux学习之ssh和scp

ls /etc/ssh可以看到这个目录下有一些文件,而/etc/ssh/ssh_config是客户端配置文件,/etc/ssh/sshd_config是服务端配置文件。 cat -n /etc/ssh/sshd_config | grep "Port "可以看一下sshd监听端口的配置信息,发现这个配置端口是22…...

录制游戏视频的软件有哪些?分享3款软件!

“有录制游戏视频的软件推荐吗?最近迷上了网游,想录制点自己高端操作的游戏画面,但是不知道用什么软件录屏比较好,就想问问大家,有没有好用的录制游戏视频软件。” 在游戏领域,玩家们喜欢通过录制游戏视频…...

每日一题——螺旋矩阵

题目 给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。 数据范围:0≤n,m≤10,矩阵中任意元素都满足 ∣val∣≤100 要求:空间复杂度 O(nm) ,时间复杂度 O(nm)…...

前端面试的性能优化部分(12)每天10个小知识点

目录 系列文章目录前端面试的性能优化部分(1)每天10个小知识点前端面试的性能优化部分(2)每天10个小知识点前端面试的性能优化部分(3)每天10个小知识点前端面试的性能优化部分(4)每天…...

SAP BTEs 业务交易事件/增强(Business Transaction Event)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、BTEs是什么? 二、使用步骤 1.查找BTE event 2.处理FM 总结 前言 SAP BTEs是一种新型的增强方式,可以通过事务代码FIFB打开&#…...

leetcode做题笔记90. 子集 II

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。 思路一:回溯 int comp(const void* a, cons…...

“开发和运维”只是一个开始,最终目标是构建高质量的软件工程

随着技术的飞速发展,软件行业不断寻求改进和创新的方法来提供更高质量的产品。在这方面,DevOps已经展现出了巨大的潜力。通过打破开发和运维之间的壁垒,DevOps将持续集成、持续交付和自动化流程引入到软件开发中,使团队能够更快地…...

自学C#,要懂得善用MSDN

很多初学者学习编程,都会通过看别人写的教程、或者录制的视频,来学习。 这是一个非常好的途径,因为这个是非常高效的。 但是这样,存在两个问题: 1、教程不够全面:任何再好的教程,都无法囊括所…...

mac上如何压缩视频大小?

mac上如何压缩视频大小?由于视频文件体积庞大,常常会占据我们设备的大量存储空间。通常情况下,我们选择删除视频以释放内存,但这将永久丢失它们。然而,有一种更好的方法可以在不删除视频的情况下减小内存占用&#xff…...

git merge规则

参考文档:https://juejin.cn/post/7129333439299321887 丹尼尔:Hi,蛋兄,周杰伦都出新专辑了,你咋还不更新啊,真的打算半年一更啊? 蛋先生:好像确实是这样,要不&#xff0…...

【周末闲谈】关于“数据库”你又知道多少?

个人主页:【😊个人主页】 系列专栏:【❤️周末闲谈】 系列目录 ✨第一周 二进制VS三进制 ✨第二周 文心一言,模仿还是超越? ✨第二周 畅想AR 文章目录 系列目录前言数据库数据库的五大特点数据库介绍数据库管理系统&a…...

C++ 对象生成:构造函数

对象生成:构造函数 一、构造函数特性二、三种构造函数1.无参构造函数2.有参构造函数3.拷贝构造函数 一、构造函数特性 C编译器提供了构造函数供程序生成对象这是一个与类同名的函数,参数可以有多种形式(重载)没有返回类型声明一般…...

RFID如何在汽车混流生产中进行车辆跟踪?

在汽车混流生产中,RFID技术可以对每个车辆进行唯一标识,从而实现车辆生产全程跟踪。实时确定车辆的位置、状态和生产过程,生产管理系统就能够对生产流程进行实时监控和管理,及时发现和解决问题,提高生产效率和质量。 焊…...

差值结构的复合底部

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点,AB训练集各由6张二值化的图片组成,让A 中有3个点,B中有1个点,且不重合,统计迭代次数并排序。 其中有20组数据 让迭代次数与排斥能成反比,排…...

在Docker 上使用 Nginx 配置https及wss

预先创建挂载文件 /mydata/nginx/conf/nginx.conf /mydata/nginx/cert /mydata/nginx/conf.d /mydata/nginx/html /mydata/nginx/logs运行并且挂载容器 docker run -p 80:80 -p 443:443 --name nginx01 --restartalways \ -v /mydata/nginx/conf/nginx.conf:/etc/nginx/ngi…...

git回退操作

1. 在工作区回退: 此时文件没有经过任何提交 git checkout -- filename2. git add之后回退 git reset HEAD3. git commit 之后回退 git reset --hard commit_id(前4位)其中,commit_id可通过git log查看,例如: qzcryqz MINGW6…...

C++系列-类和对象-静态成员

类和对象-静态成员 静态成员静态成员变量静态成员函数 静态成员 静态成员就是在成员变量或者是成员函数前面加上static关键字。 静态成员变量 所有对象共享同一份数据在编译阶段分配内存类内声明,类外初始化可以通过对象或者类名进行访问。静态成员变量也具有访问…...

SAP MM学习笔记26- SAP中 振替转记(转移过账)和 在库转送(库存转储)2- 品目Code振替转记 和 在库转送

SAP 中在库移动 不仅有入库(GR),出库(GI),也可以是单纯内部的转记或转送。 1,振替转记(转移过账) 2,在库转送(库存转储) 1&#xff…...

【Python机器学习】实验13 基于神经网络的回归-分类实验

文章目录 神经网络例1 基于神经网络的回归(简单例子)1.1 导入包1.2 构造数据集(随机构造的)1.3 构造训练集和测试集1.4 构建神经网络模型1.5 采用训练数据来训练神经网络模型 实验:基于神经网络的分类(鸢尾花数据集)1. 导入包2. 构造数据集3.…...

【数据结构】二叉树的链式结构的实现 -- 详解

一、前置说明 在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。为了降低大家学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习。 typedef char BTDataType;typedef struct Binar…...

【C语言】什么是结构体内存对齐?结构体的大小怎么计算?

目录 1.结构体内存对齐 对偏移量的理解:​ 2.结构体的大小计算 2.1结构体中只有普通的数据类型的大小计算 2.2 结构体中有嵌套的结构体的大小计算 3.修改默认对齐数 4.为什么存在内存对齐? 这篇文章主要介绍结构体内存对齐和如何计算大小。 在学习结构体内存…...

【Redis】Redis中的布隆过滤器

【Redis】Redis中的布隆过滤器 前言 在实际开发中,会遇到很多要判断一个元素是否在某个集合中的业务场景,类似于垃圾邮件的识别,恶意IP地址的访问,缓存穿透等情况。类似于缓存穿透这种情况,有许多的解决方法&#xf…...

接口测试 —— Jmeter 参数加密实现

Jmeter有两种方法可以实现算法加密 1、使用__digest自带函数 参数说明: Digest algorithm:算法摘要,可输入值:MD2、MD5、SHA-1、SHA-224、SHA-256、SHA-384、SHA-512 String to be hashed:要加密的数据 Salt to be…...

Linux c语言字节序

文章目录 一、简介二、大小端判断2.1 联合体2.2 指针2.3 网络字节序 一、简介 字节序(Byte Order)指的是在存储和表示多字节数据类型(如整数和浮点数)时,字节的排列顺序。常见的字节序有大端字节序(Big En…...

批量将excel中第5列中内容将人名和电话号码进行分列

使用Python可以使用openpyxl库来实现批量将Excel中第5列的内容分列为人名和电话号码的操作。下面是示例代码: import openpyxl def split_names_and_phone_numbers(file_path, sheet_name): # 加载Excel文件 workbook openpyxl.load_workbook(file_path) …...

WPF DataGrid columns表头根据数据集动态动态生成Demo

思路是这样的&#xff0c;数组集合装表头的信息&#xff0c;遍历这个集合&#xff0c;遍历过程中处理一下数据&#xff0c;然后就把每表头信息添加到dataGrid2.Columns.Add(templateColumn); 1&#xff0c;页面Xaml代码&#xff1a; <DataGrid x:Name"dataGrid" …...

1339. 分裂二叉树的最大乘积

链接&#xff1a; ​​​​​​1339. 分裂二叉树的最大乘积 题解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …...

【C++】Stack和Queue

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析3 目录 &#x1f449;&#x1f3fb;Stack Constructor&#x1f449;&#x1f3fb;Stack …...

Maven之tomcat7-maven-plugin 版本低的问题

tomcat7-maven-plugin 版本『低』的问题 相较于当前最新版的 tomcat 10 而言&#xff0c;tomcat7-maven-plugin 确实看起来很显老旧。但是&#xff0c;这个问题并不是问题&#xff0c;至少不是大问题。 原因 1&#xff1a;tomcat7-maven-plugin 仅用于我们&#xff08;程序员&…...

在项目中如何解除idea和Git的绑定

在项目中如何解除idea和Git的绑定 1、点击File--->Settings...(CtrlAltS)--->Version Control--->Directory Mappings--->点击取消Git的注册根路径&#xff1a; 2、回到idea界面就没有Git了&#xff1a; 3、给这个项目初始化 这样就可以重新绑定远程仓库了&#x…...

AGI 在网易云信的技术提效和业务创新

We believe our research will eventually lead to artificial general intelligence, a system that can solve human-level problems. Building safe and beneficial AGI is our mission. ---- OpenAI 通用人工智能 AGI 作为 AI 的终极形态&#xff0c;是 AI 行业内追求的演…...

线性代数的学习和整理9(草稿-----未完成)

3.3 特征值和特征向量是什么&#xff1f; 直接说现在&#xff1a;特征向量这个块往哪个方向进行了拉伸&#xff0c;各个方向拉伸了几倍。这也让人很容易理解为什么&#xff0c;行列式的值就是特征值的乘积。 特征向量也代表了一些良好的性质&#xff0c;即这些线在线性变换后…...

React的useReducer与Reudx对比

useReducer 和 Redux 都是用于处理应用程序的状态管理的工具&#xff0c;但它们在概念和使用场景上存在一些区别。 useReducer&#xff1a; useReducer 是 React 提供的一个 Hook&#xff0c;用于管理局部状态。它接受一个 reducer 函数和初始状态&#xff0c;并返回一个包含当…...

深度学习环境搭建 cuda、模型量化bitsandbytes安装教程 windows、linux

cuda、cudann、conda安装教程 输入以下命令&#xff0c;查看 GPU 支持的最高 CUDA 版本。 nvidia-smi cuda安装&#xff08;cudatoolkit&#xff09; 前往 Nvidia 的 CUDA 官网&#xff1a;CUDA Toolkit Archive | NVIDIA Developer CUDA Toolkit 11.8 Downloads | NVIDIA …...

pythond assert 0 <= colx < X12_MAX_COLS AssertionError

python使用xlrd读取excel时&#xff0c;报错&#xff1a; assert 0 < colx < X12_MAX_COLS AssertionError 大意是excel列太多了。主要是xlrd库的问题。最好的方法是不用它&#xff0c;但是我用的其他人提供的工具用到它&#xff0c;没法改。 尝试手动删除excel的列&am…...

js简介以及在html中的2种使用方式(hello world)

简介 javascript &#xff1a;是一个跨平台的脚本语言&#xff1b;是一种轻量级的编程语言。 JavaScript 是 Web 的编程语言。所有现代的 HTML 页面都使用 JavaScript。 HTML&#xff1a; 结构 css&#xff1a; 表现 JS&#xff1a; 行为 HTMLCSS 只能称之为静态网页&#xff0…...

vsCode使用cuda

一、vsCode使用cuda 前情提要&#xff1a;配置好mingw&#xff1a; 1.安装cuda 参考&#xff1a; **CUDA Toolkit安装教程&#xff08;Windows&#xff09;&#xff1a;**https://blog.csdn.net/qq_42951560/article/details/116131410 2.在vscode中添加includePath c_cp…...

ubuntu无法使用apt命令时怎么安装库

如题 因为某些原因&#xff0c;不能直接联网使用apt命令安装库。只能手动去ubuntu镜像源里 找对应的包的deb安装文件 镜像源地址&#xff08;适用于AMD64架构,就是常见的PC的X86-64啦&#xff09; 镜像源地址&#xff08;适用于ARM64,armhf,ppc64el,riscv64,s390x架构&#xff…...

防火墙firewall

一、什么是防火墙 二、iptables 1、iptables介绍 2、实验 138的已经被拒绝&#xff0c;1可以 三、firewalld 1、firewalld简介 关闭iptables&#xff0c;开启firewalld&#xff0c;curl不能使用&#xff0c;远程连接ssh可以使用 添加80端口 这样写也可以&#xff1a;添加http…...

拿来即用,自己封装的 axios

文章目录 一、需求二、分析1. 安装axios2. 新建一个 ts 文件&#xff0c;封装 axios3. store 存放 token 信息4. 使用5. 文件 type.js 一、需求 在日常开发中&#xff0c;我们会经常用到 axios &#xff0c;那么如何在自己的项目中自己封装 axios 二、分析 1. 安装axios np…...

Hadoop小结(下)

HDFS 集群 HDFS 集群是建立在 Hadoop 集群之上的&#xff0c;由于 HDFS 是 Hadoop 最主要的守护进程&#xff0c;所以 HDFS 集群的配置过程是 Hadoop 集群配置过程的代表。 使用 Docker 可以更加方便地、高效地构建出一个集群环境。 每台计算机中的配置 Hadoop 如何配置集群…...

使用老北鼻AI免费GPT对话解决gun make安装和解析iso9660的问题

在学习解析ISO9660镜像文件时&#xff0c;使用了GPT来了解相关的库和gun make编译器的相关知识。这个过程可真是一言难尽&#xff0c;每个问题的回答都模棱两可都需要去证实&#xff0c;不能直接复制粘贴&#xff0c;也不能说GPT的回答一点用也没有&#xff0c;至少GPT给出了一…...

shell脚本语句

一、语句 一、条件语句 一、以用户为例演示 一、显示当前登录系统的用户信息 w命令 二、显示有多少个用户 w | wc -l 显示有7个用户 前两个是固定标题&#xff0c;从第三个开始才是登录用户&#xff0c;所以要统计数量需要 命令&#xff1a;echo $[$(w | wc -l) -2] 显示…...

【LeetCode】2235.两整数相加

题目 给你两个整数 num1 和 num2&#xff0c;返回这两个整数的和。 示例 1&#xff1a; 输入&#xff1a;num1 12, num2 5 输出&#xff1a;17 解释&#xff1a;num1 是 12&#xff0c;num2 是 5 &#xff0c;它们的和是 12 5 17 &#xff0c;因此返回 17 。示例 2&…...

springboot sl4j2 写入日志到mysql

问题描述 springboot初始化的时候&#xff0c;会先初始化日志然后再加载数据源如果用配置文件进行初始化&#xff0c;那么会出现数据源没有加载成功&#xff0c;导致空指针异常 报错排查如下&#xff1a; 搜索报错信息&#xff0c;OBjects.invoke is Null打断点发现。dataso…...

用 PyTorch 编写分布式应用程序

用 PyTorch 编写分布式应用程序 在这个简短的教程中&#xff0c;我们将介绍 PyTorch 的分布式软件包。 我们将了解如何设置分布式设置&#xff0c;使用不同的交流策略以及如何仔细查看软件包的内部结构。 设定 PyTorch 中包含的分布式软件包(即torch.distributed&#xff09…...

空间分析专属 Python 学习资料

空间数据分析能够帮助我们更好地理解地理空间中的模式和关系&#xff0c;从而为决策提供支持。例如&#xff0c;城市规划者可以使用空间数据分析来确定城市发展的最佳方向&#xff0c;环境科学家可以使用空间数据分析来评估污染的影响&#xff0c;而商业分析师可以使用空间数据…...

2. Linux Server 20.04 Qt5.14.2配置Jetson Orin Nano Developer Kit 交叉编译环境

最近公司给了我一块Jetson Orin Nano的板子&#xff0c;先刷了系统&#xff08;1.Jetson Orin Nano Developer Kit系统刷机&#xff09;又让我搭建交叉编译环境&#xff0c;所以有了下面的文章 一 :Qt5.14.2交叉编译环境安装 1.准备 1.1设备环境 1.1.1 Server: Ubuntu20.0…...

vue入门

Attribute 绑定 v-bind:取值方式 开发前准备 安装node.js需要高于15.0 创建vue项目 npm init vuelatest安装 npm install 启动 npm run dev模板语法 文本插值 {{ 变量 }} <p> {{ mesg }} </p>这种方式公支持单一表达式&#xff0c;也可以是js代码&#xf…...