网络udp及ipc内存共享

大字符串找小字符串

调试

1. 信号处理函数注册:•一旦使用 signal 函数注册了信号处理函数,该函数就会一直有效,直到程序结束或者显式地取消注册。2. 注册多次的影响:•如果多次注册同一信号的处理函数,最后一次注册的处理函数将成为有效的处理函数。•重复注册同一信号的处理函数并不会累加效果,而是覆盖之前的注册。3. 取消注册:•如果想要取消信号处理函数的注册,可以再次调用 signal 函数,并将 handler 参数设置为 SIG_DFL 或 SIG_IGN。

2.在Linux系统中,每个共享内存段都通过一个唯一的键值来标识。当进程想要访问某个共享内存段时,它会通过shmget函数并传入该共享内存段的键值来请求系统分配或返回该内存段的标识符(shmid)。系统会根据键值来查找对应的共享内存段,如果找到,就返回该内存段的标识符给进程;如果找不到,且进程请求的是创建新的共享内存段,那么系统会根据键值(如果使用的是非IPC_PRIVATE的键值)检查是否已经存在一个同名的共享内存段,如果不存在,则创建一个新的共享内存段并返回其标识符。

由于键值的唯一性,不同的进程如果想要访问不同的共享内存段,就需要使用不同的键值。这样,即使多个进程都在请求共享内存段,它们也能够通过各自的键值来访问到正确的内存段,而不会发生误操作或数据冲突。

当然,如果两个或多个进程想要共享同一个内存段,它们就需要使用相同的键值来访问该内存段。这通常是通过在进程之间共享这个键值来实现的,比如通过环境变量、配置文件或命令行参数等方式传递。

需要注意的是,虽然键值确保了共享内存段的唯一性,但在使用共享内存进行进程间通信时,还需要注意同步和互斥问题,以避免数据竞争和不一致性。这通常需要通过信号量、互斥锁等同步机制来实现。

数据传输过程1. 数据包的封装与解封装:•当数据从发送方传输到接收方时,它会经历一个封装过程,然后在网络中传输,最后进行解封装。•在封装过程中,数据会被添加头部信息,形成数据包。2. 网络层与链路层:•网络层:负责将数据包从源主机路由到目的主机,使用 IP 地址。•链路层:负责在局域网内将数据包从源设备传输到目的设备,使用 MAC 地址。IP 地址与 MAC 地址的关系

1. IP 地址:•IP 地址用于在网络层标识设备。•当数据包需要从一个网络传输到另一个网络时,路由器使用 IP 地址进行路由决策。

2. MAC 地址:•MAC 地址用于在链路层标识设备。•当数据包需要在同一局域网内传输时,使用 MAC 地址将数据包从源设备发送到目的设备。

3. ARP 协议:•在局域网中,ARP 协议用于将 IP 地址映射到 MAC 地址。•当设备需要向另一台设备发送数据时,它首先查询 ARP 缓存以查找目标 IP 地址对应的 MAC 地址。•如果找不到,则发送一个 ARP 请求广播,询问目标 IP 地址对应的 MAC 地址。•目标设备会回复一个 ARP 应答,包含其 MAC 地址。

为什么需要 MAC 地址虽然 IP 地址已经足够标识网络中的设备,但在局域网内,数据包的实际传输是通过 MAC 地址完成的。这是因为:1. 链路层转发:•数据包在局域网内的传输是由链路层完成的,而链路层使用 MAC 地址进行转发。•MAC 地址确保数据包能够在局域网内准确地从一个设备传输到另一个设备。2. 局域网内的直接通信:•在同一局域网内,设备之间的通信不需要通过路由器,直接通过 MAC 地址进行。3. 提高效率:•使用 MAC 地址可以提高数据包在局域网内的传输效率。•MAC 地址的使用减少了对路由器的依赖,加快了数据包的转发速度。

示例假设有一台设备 A 需要向同一局域网内的设备 B 发送数据:1. 查找 IP 地址:•设备 A 已知设备 B 的 IP 地址为 192.168.1.3。2. 查找 MAC 地址:•设备 A 查询 ARP 缓存,如果找到了设备 B 的 MAC 地址,则直接使用。•如果没有找到,则发送一个 ARP 请求广播,询问 192.168.1.3 对应的 MAC 地址。•设备 B 回复 ARP 应答,包含其 MAC 地址 00:1F:2G:3H:4I:5J。3. 发送数据:•设备 A 在数据帧中使用设备 B 的 MAC 地址 00:1F:2G:3H:4I:5J 发送数据。

帧数据(Frame Data)是计算机网络中链路层(第二层)的数据单位。在数据从发送方传输到接收方的过程中,数据在每一层都会被封装成不同的格式。在链路层,数据被封装成帧(Frames)。帧数据的组成帧数据通常包含以下几个部分:1. 帧头(Header):•包含控制信息,如源 MAC 地址、目的 MAC 地址、帧类型等。•帧头还包括一些用于确保数据完整性、同步等的信息。2. 数据字段(Data Field):•包含来自上一层(通常是网络层)的数据,如 IP 数据报。3. 帧尾(Trailer):•通常包含校验和(Checksum)或循环冗余校验(CRC)等用于检测传输错误的信息。帧数据的格式帧数据的具体格式可能因使用的链路层协议而异,但大多数帧数据格式遵循类似的结构。下面是一个通用的帧数据格式示例:+----------------+----------------+----------------+----------------+
| Preamble | Start Frame Delimiter | Destination MAC |
+----------------+----------------+----------------+----------------+
| Source MAC | Length / Type | Data | Frame Check Sequence |
+----------------+----------------+----------------+----------------+
plaintext1. Preamble:•一系列的位,用于帮助接收端设备同步。•通常由多个 10101010 的序列组成。2. Start Frame Delimiter (SFD):•标志帧的开始。3. Destination MAC:•目的设备的 MAC 地址。4. Source MAC:•发送设备的 MAC 地址。5. Length / Type:•数据字段的长度或类型。6. Data:•包含来自网络层的数据。7. Frame Check Sequence (FCS):•用于检测传输错误的校验和或 CRC。

示例假设有一条从发送方传输到接收方的数据,这条数据在网络层被封装成 IP 数据报,然后在链路层被封装成帧数据:1. 网络层:•IP 数据报包含源 IP 地址、目的 IP 地址、协议类型等信息。2. 链路层:•IP 数据报被封装成帧数据。•帧数据包括帧头、数据字段(IP 数据报)和帧尾。

总结•帧数据:链路层的数据单位。•组成:帧头、数据字段、帧尾。•用途:确保数据在局域网内的准确传输。

1. 应用层数据:•原始数据,例如一段文本或图像。

2. 传输层:•数据被分割成较小的部分,并添加 TCP 或 UDP 头部,形成传输层数据段。

3. 网络层:•传输层数据段被封装成数据包,添加 IP 地址等信息。

4. 链路层:•数据包被封装成帧数据,添加 MAC 地址等信息。

5. 物理层:•帧数据被转换为比特流,在物理介质上传输。

6. 接收方:•物理层接收到比特流,并将其转换为帧数据。•链路层解封装帧数据,提取出数据包。•网络层解封装数据包,提取出传输层数据段。•传输层解封装数据段,重组原始数据。

OSI 七层模型OSI(Open Systems Interconnection)七层模型是一种理论模型,用于描述计算机网络中不同层次的功能。

它将网络通信分解为七个不同的层次,每个层次负责不同的功能。下面是 OSI 七层模型各层的具体含义:

1. 应用层(Layer 7)•功能: •提供应用程序和服务之间的接口。•支持文件传输、电子邮件、打印服务等功能。•为用户提供访问网络资源的方法。•常见协议:HTTP, FTP, SMTP, Telnet, SSH, SNMP 等。

2. 表示层(Layer 6)•功能: •负责数据的编码和解码。•处理数据压缩、加密和解密等。•常见协议:JPEG, MPEG, ASCII, DES, RSA 等。

3. 会话层(Layer 5)•功能: •建立、管理和终止会话。•控制数据交换的同步。•提供会话恢复和检查点等机制。•常见协议:SQL, RPC, NCP, NetBIOS, ASP 等。

4. 传输层(Layer 4)•功能: •提供端到端的数据传输服务。•确保数据的可靠传输,包括错误检测、纠正和流量控制。•分割和重组数据。•常见协议:TCP, UDP 等。

5. 网络层(Layer 3)•功能: •负责路由选择和数据包的转发。•提供逻辑寻址(如 IP 地址)。•控制拥塞和数据包的排序。•常见协议:IP, ICMP, ARP, RARP, OSPF, BGP 等。

6. 数据链路层(Layer 2)•功能: •负责在相邻节点之间传输数据帧。•提供物理地址(如 MAC 地址)。•进行错误检测和流量控制。•常见协议:Ethernet, Token Ring, PPP, HDLC 等。

7. 物理层(Layer 1)•功能: •负责在物理介质上进行比特流的传输。•定义电气特性、机械特性、功能特性和过程特性。•提供物理连接的建立、维护和释放。•常见协议:RS-232, V.35, RJ-45, BNC, AUI 等。

各层之间的关系1. 数据封装:•当数据从高层向低层传输时,每层都会添加自己的头部信息,形成数据单元。•数据单元在不同层有不同的名称: •应用层:数据•表示层:数据•会话层:会话数据单元 (SDU)•传输层:数据段 (Segment)•网络层:数据包 (Packet)•数据链路层:数据帧 (Frame)•物理层:比特流 (Bit Stream)2. 数据解封装:•当数据从低层向高层传输时,每层都会去除自己添加的头部信息,还原原始数据。•数据在接收方的每个层次被解封装,直至恢复为原始数据。示例假设有一条从发送方传输到接收方的数据,这条数据在网络的不同层次中被封装的过程如下:1. 应用层:•原始数据,例如一段文本或图像。

2. 表示层:•数据被编码或加密。

3. 会话层:•数据被封装成会话数据单元 (SDU)。

4. 传输层:•SDU 被分割成较小的部分,并添加 TCP 或 UDP 头部,形成数据段。

5. 网络层:•数据段被封装成数据包,添加 IP 地址等信息。

6. 数据链路层:•数据包被封装成帧数据,添加 MAC 地址等信息。

7. 物理层:•帧数据被转换为比特流,在物理介质上传输。总结•OSI 七层模型:将网络通信分解为七个不同的层次,每个层次负责不同的功能。•各层功能:从应用层到物理层,描述了数据在网络中的传输过程。•数据封装与解封装:数据在网络的不同层次中被封装和解封装。

    • 网络协议的作用网络协议是规定网络通信的标准和规则,同时也是实现网络通信的基础。网络协议定义了数据在网络中传输的方式,包括数据的格式、传输的规则、错误处理等各个方面。下面详细介绍网络协议的作用:规定标准
    • 1. 定义通信规则:•网络协议定义了不同设备之间通信的规则和标准。•它们规定了数据的格式、传输的顺序、错误处理方法等。
    • 2. 确保兼容性:•网络协议确保不同制造商生产的设备可以相互通信。•通过遵循共同的协议标准,设备可以相互识别和交换数据。
    • 3. 标准化数据格式:•网络协议定义了数据在网络中传输时的格式。•例如,TCP/IP 协议族中的 IP 协议定义了 IP 数据包的格式。
    • 实现网络通信1. 数据传输:•网络协议提供了数据在网络中传输的方法。•它们定义了数据如何被封装、如何被传输、以及如何被解封装。
    • 2. 错误检测与纠正:•网络协议包含了错误检测和纠正机制。•例如,TCP 协议使用序列号和确认机制来确保数据的可靠传输。
    • 3. 路由选择:•网络协议定义了数据在网络中如何被路由。•例如,IP 协议使用路由表来确定数据包的最佳路径。
    • 4. 资源管理:•网络协议还涉及到网络资源的管理。
    • •例如,TCP 协议中的流量控制机制可以帮助防止网络拥塞。示例假设两台计算机通过 TCP/IP 协议族进行通信:1. 应用层:•HTTP 协议定义了 Web 服务器和客户端之间的通信规则。2. 传输层:•TCP 协议确保数据可靠传输,提供流控制和错误检测机制。3. 网络层:•IP 协议定义了数据包在网络中的路由和寻址规则。4. 数据链路层:•Ethernet 协议定义了局域网内的数据帧格式和传输规则。5. 物理层:•定义了物理连接的电气特性、信号传输方式等。总结•规定标准:网络协议定义了通信的规则和标准。•实现通信:网络协议提供了实现网络通信的方法。•兼容性与互操作性:网络协议确保不同设备可以相互通信。

先发给网关,子网掩码和ip与后,网络号就知道了,网关就知道是给外面发还是在局域网内

iPV4,32位

ipv6,128位

p2p,点对点,可能用的越多带宽越大

网络编程:
   tcp / udp  

IPC 进程间通信方式
  
  共享内存   //最高效的进程间通信方式 


【原理】:        
+-进程A-+              +-进程B-+   <--        
|       |              |       |     ^
|       |              |       |     |
|       |              |       |    0~3G
|       |              |       |     
|       |              |       |     |
|       |              |       |     |
|       |                |       |     V
+------------------------------+     --
|         内核                 |     1G
+------------------------------+   <----


共享内存:

                  [内存]
                  |    |
                  +----+                  
[进程A]           |    |                 [进程B]
    \---------->  |    | <---------------/
                  |    |
                  +----+                  
                  |    | 
                  |    |
                  |    | 
                  |    |
                  
    虚拟地址     mmu(memory management unit )          
                   fifo 
                   
                   
共享内存:
  1.是一块,内核预留的空间 
  2.最高效的通信方式 
   //避免了用户空间 到 内核空间的数据拷贝
  
  

IPC通信方式 ---操作流程类似的 
操作:
         system v :  共享内存 

    IPC对象操作通用框架:
    0x  ftok
    key值 ==> 申请 ==》读写 ==》关闭 ==》卸载


    InterProcessCommunication  //IPC 

                  |进程A|        |进程B|
                     \             /
[用户空间]            ````[key]```       //name ---fifo 
                            |
                          xxxget()函数 //建立了 key <==>ipc对象之间的一一对应的关系
                            |
----------------------------|--------------   
[内核空间]                  |   
                            |
                         [IPC对象]//共享内存 
                         
    


//step1 产生key值 
ftok //


#include <sys/types.h>
       #include <sys/ipc.h>

       key_t ftok(const char *pathname, int proj_id);
       功能:
             将pathname 和 proj_id 转换为 key值 
       参数:
        @pathname  //给一个路径名 
        @proj_id   //工程id       eg: 'A'
       返回值
          成功 key值
          失败 -1     

//step2 通过key获取ipc对象 (共享内存)
shmget   //shared memory 


//1、申请对象:shmget()
    #include <sys/ipc.h>
    #include <sys/shm.h>
    ps aux|grep a.out
        shared memory get         IPC_CREAT|0666
    int shmget(key_t key, size_t size, int shmflg);
    功能:
         使用唯一键值key向内核提出共享内存使用申请
    参数:key   唯一键值
          size  要申请的共享内存大小
          shmflg 申请的共享内存访问权限,八进制表示
          如果是第一个申请,则用IPC_CREAT
          如果要检测是否存在,用IPC_EXCL
    返回值:
            成功 返回共享内存id,一般用shmid表示
            失败  -1;

            share memory attach

//step3 共享内存 绑定 
shmat 

    映射对象:shmat()
    void *shmat(int shmid, const void *shmaddr, int shmflg);
    功能:将指定shmid对应的共享内存映射到本地内存。
    参数:shmid 要映射的本地内存
          shmaddr 本地可用的地址,如果不确定则用NULL,表示
                  由系统自动分配。
          shmflg  
          0         ,  表示读写
          SHM_RDONLY, 只读
    返回值:
           成功 返回映射的地址,一般等于shmaddr
            失败 (void*)-1        

//step4 解除绑定(映射)

    撤销映射:shmdt
    int shmdt(const void *shmaddr);
    功能:将本地内存与共享内存断开映射关系。
    参数:shmaddr 要断开的映射地址。
    返回值:成功  0
            失败  -1;

          

//step4 销毁IPC对象 
        删除对象:shmctl
    int shmctl(int shmid, int cmd, struct shmid_ds *buf); //ctl = control 
    功能:
         修改共享内存属性,也可以删除指定的共享内存对象。
    参数:shmid 要删除的共享内存对象
          cmd 
               IPC_RMID 删除对象的宏
          buff  NULL 表示只删除对象。
    返回值:成功 0
            失败 -1
      
          总结:                      
    1、共享内存数据的存储方式是拷贝还是剪切?
        拷贝
    2、共享内存的数据如果多次不同进程读写会怎么样?
        同一操作对象,数据没有偏移情况下会覆盖。
IPC对象 -- 共享内存 
消息队列 
信号量集     
--------------------------------------------------------------------------
单主机内的进程间通信方式:
传统
   管道 
     有名管道
     无名管道 
   信号    
IPC对象
   共享内存   //通信效率最高的 
   (*)消息队列
   (*)信号量集 
--------------------------------------------------------------------------
进程通信方式:
  不同主机间    //网络通信 
  
 

实现网络通信
1.物理层面 有一个 信息通路  
  有线 
  无线 
     5G
     4G 
     星链 
2.软件层面(逻辑层面) 也需要 一个通路 
   
TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高可靠性通信(即数
据无误、数据无丢失、数据无失序、数据无重复到达的通信)

* 适用情况:
1. 适合于对传输质量要求较高,以及传输大量数据
的通信。
2. 在需要可靠数据传输的场合,通常使用TCP协议
3. QQ等即时通讯软件的用户登录账户管理相关
的功能通常采用TCP协议

tcp协议特点:
1. 面向连接   //类似打电话通话之前 ,必须先打通 
2. 可靠传输   //保证数据准确可靠 (tcp协议机制 里面的功能 )
3. 面向字节流程

UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议。
在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。

* 适用情况:
1. 发送小尺寸数据(如对DNS服务器进行IP地址查询时)
2. 在接收到数据,给出应答较困难的网络中使用UDP。(如:无
线网络)
3. 适合于广播/组播式通信中。
4. MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通
讯通常采用UDP协议
5. 流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP
方式进行实时数据传输

UDP特点:    //广播 
1.不可靠 
2.无连接 
3.数据报  
-----------------------------------------------------------------------------------
编程:
  编程模型 
     c/s    client server    客户端,服务器模型     --- 专用客户端 
     b/s    browser server   浏览器,服务器模型     --- 通用的客户端 
     p2p    peer to peer     点对点传输 
     
     

基于UDP c/s通信模型:
//client ---客户端 --- 角色  --- 主动的角色  
socket    //1.一种特殊的文件 --- 专门用于网络通信(不同主机间的进程)
          //2.socket 编程接口  --- socket 函数 
          //提供了一个可以访问 操作系统 网络功能的接口 
          
sendto //发数据 
... 


//server --- 服务器端 --角色 --- 被动的角色  
socket 
recvfrom    //接收数据 
...

//socket 

 int socket(int domain, int type, int protocol);
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

int socket(int domain, int type, int protocol);
功能:程序向内核提出创建一个基于内存的套接字描述符    
参数:   
      //domain --域 (范围) ---socket 用于什么范围的通信
      //           ipv4 
     //               ipv6 
      domain  地址族,PF_INET == AF_INET ==>互联网程序
                      PF_UNIX == AF_UNIX ==>单机程序
      type    套接字类型:
                SOCK_STREAM  流式套接字 ===》TCP   
              SOCK_DGRAM   用户数据报套接字===>UDP
              //SOCK_RAW     原始套接字  ===》IP
      protocol 协议 ==》0 表示自动适应应用层协议。

返回值:

        成功 返回申请的套接字文件描述符 
        失败  -1
        
      
    ssize_t sendto(    int sockfd,  //用于通信的socket对应的fd
                  const void *buf,  //表示要发送的数据所在的一块空间 
                       size_t len,  //表示发送的字节数 
                        int flags,  //0  --- 默认  
 const struct sockaddr *dest_addr,  //表示 要发送到的 地址 (网络地址 ip+端口号 ) 
                socklen_t addrlen   //表示dest_addr 这个参数的长度 
                );
      
      返回值:
          成功  发送出去的字节的数 
          失败  -1 
          
          
             struct sockaddr_in {
               sa_family_t    sin_family; /* address family: AF_INET */
               in_port_t      sin_port;   /* port in network byte order */
               struct in_addr sin_addr;   /* internet address IP */
           };

           /* Internet address. */
           struct in_addr {
               uint32_t       s_addr;     /* address in network byte order */
           };

 
          
         
          
端口号:
    端口号:  16位数值(unsigned short ) //0~65535 (65536个数)
       //标示一个进程
      TCP和 UDP 的端口号是独立的
  端口号:
    (1) 
       作用:唯一的标识一个进程
       每一个应用程序进程有一个端口号,
       通讯时区分数据包属于哪个应用程序进程

     (2) 分类
      
      端口号一般由IANA (Internet Assigned NumbersAuthority) 管理
   众所周知端口:
                  1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用)
                  知名端口号(已经分配给标准应用服务软件) 
                  如: 
                  http协议用到的端口号 80 
    已登记端口:  
                  1024~49151
                  注册端口号(非标准应用服务软件的软件可以申请的端口号范围)
    动态或私有端口://50000 以上的端口号 
                  49152~65535 动态分配的端口号(系统动态分配给应用程序使用的)

   (3) 长度
    2字节(16bit) 
    
    leetcode //力扣 
    
    
    
            00 12
    数字转换函数:
    #include <arpa/inet.h>
    1236234687
    主机转网络:
                uint32_t htonl(uint32_t hostlong);
    ipv4 192.168.0.1 1~65535
                uint16_t htons(uint16_t hostshort);
    网络转主机:host to net 
                net to host 
                uint32_t ntohl(uint32_t netlong);
                uint16_t ntohs(uint16_t netshort);


    htonl --- h(host) to n(network) l (long)  //32位的数据
       htons --- h(host) to n(network) s (short) //16位的数据 
    
    ntohl 
    ntohs --- n(network) to h(host)  s (short) 
    
    字符串转换函数:
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>

    主机转网络:
    in_addr_t inet_addr(const char *cp);
    inet_addr("192.168.1.20");
    cli.sin_addr
    网络转主机:char *inet_ntoa(struct in_addr in); //a -- ascii 

                

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

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

相关文章

【记录】基于Windows系统安装rust环境的过程

到官网下载安装包【入门 - Rust 程序设计语言 (rust-lang.org)】 ![[Pasted image 20240703142911.png]] 选择1&#xff0c;快速安装 选择编译配置&#xff0c;1为标准 安装完成 验证是否安装完毕 rustc --versioncargo --version验证成功&#xff01;

UneMeta创始人讲述自己在Web3+IP领域创业的心路历程

昨日&#xff0c;UneMeta创始人&#xff0c;Ann_tyrion在X分享了一篇推文&#xff0c;分享了自己在探索Web3与IP产业结合过程中的心路历程&#xff0c;她并没有像很多项目方那样一味的讲述宏大的叙事&#xff0c;而是字里行间透露出对这个行业的探索和不断给自己充实信念&#…

自动操作一键数据恢复/电子取证

对磁盘模拟扫描修复丢失数据的实验。 先挂载题目磁盘VHD。 Windows系统中打开磁盘管理&#xff0c;-操作&#xff0c;-附加VHD 可以看到已经加载出题目磁盘&#xff0c;接下来打开RStudio数据恢复软件&#xff0c;对其进行扫描。 操作找回丢失/被删除的数据 可以看到已经加载出…

DRF——pagination分页模块

文章目录 分页继承APIView类用法1.PageNumberPagination2.LimitOffsetPagination3.CursorPagination 继承GenericAPIView派生类用法1.PageNumberPagination2.LimitOffsetPagination3.CursorPagination 分页 在查看数据列表的API中&#xff0c;如果 数据量 比较大&#xff0c;肯…

【前端基础篇】JavaScript之DOM介绍

文章目录 WebAPI背景知识什么是WebAPI什么是APIAPI参考文档 DOM基本概念什么是DOMDOM树查找HTML元素方法概览1. document.getElementById(id)2.document.getElementsByTagName(name)3. document.getElementsByClassName(name)4. document.querySelector(CSS选择器)5. document.…

如何免费获取乡镇级边界数据geoJson数据

如何免费获取乡镇级边界数据geoJson数据 我们可以通过 阿里云数据可视化平台 &#xff0c;可以获取到中国各个省份/区级/县级的json数据&#xff0c;但是区级和县级&#xff0c;并没有包含街道和乡镇的数据 获取乡镇级边界数据 1.下载bigemap全能版 安装好后选择你要导出的…

Graphpad Prism for Mac 医学绘图软件教程

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试安装完成&#xff01;&#xff01;&#xff01; 效果 一、下载软件 下载软件…

关于jupyter notebook 的输出 (outputs )

jupyter notebook 的输出 (outputs )在元素达到一定的个数后&#xff0c;就会按一行一个元素进行展示&#xff0c;百来个还好&#xff0c;一旦过千&#xff0c;那滚轮势必撸冒烟&#xff0c;所以能不能解决呢&#xff1f; 先看个例子&#xff0c; 一个找质数、合数的函数 cal3&…

开发高质量PDF应用的不二选择:PdfiumViewer库详细解析

1. PdfiumViewer库简介 PdfiumViewer是一款基于谷歌开源PDF渲染引擎PDFium的.NET库&#xff0c;主要用于在Windows应用程序中显示和处理PDF文档。PdfiumViewer提供了多种API和控件&#xff0c;使得开发者可以轻松地将PDF文档嵌入到其应用程序中。同时&#xff0c;PdfiumViewer…

unity游戏开发——(细)深入解析 Unity 地形系统:从基础到高级应用

Unity游戏开发 “好读书&#xff0c;不求甚解&#xff1b;每有会意&#xff0c;便欣然忘食。” 本文目录&#xff1a; Unity游戏开发 Unity游戏开发前言深入解析 Unity 地形系统&#xff1a;从基础到高级应用一、初识 Unity 地形系统1. 地形尺寸与分辨率 二、地形编辑工具详解1…

kafka发送消息-自定义消息发送的拦截器

1、自定义拦截器 创建自定义拦截器类&#xff0c;实现ProducerInterceptor接口。对消息进行拦截&#xff0c;可以在拦截中对消息做些处理&#xff0c;记录日志等操作… package com.power.config;import org.apache.kafka.clients.producer.ProducerInterceptor; import org…

【Spring Boot】全局异常处理

目录 背景 前言 设计步骤 1.定义异常信息类&#xff1a; 2.自定义异常&#xff1a; 3.创建全局异常处理类 4.在控制器中抛出异常 5.输出 捕获 Valid 校验异常 背景 去面试的时候被问到SpringBoot项目中&#xff0c;如何处理全局异常的&#xff0c;也就是如何捕获全局异…

vue2 part2

数据代理 通过defineProperty里面传入obj2和x&#xff0c;然后get和set下读取接收下然后再接收set中给对象x用value接收下&#xff0c;这样就能两个数据读取和接收了 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>何…

浅谈【数据结构】链表之单链表

目录 1、什么是数据&#xff1f; 2、什么是结构 3、什么是数据结构&#xff1f; 4、线性结构(线性表&#xff09; 4.1线性表的物理结构的实现 5、链表 5.1无头结点的单链表 5.2新内容、老面孔 5.3数组和链表的优缺点 5.4链表的概念 5.5链表的创建步骤 5.5.1创建过程…

芯片后端之 PT 使用 report_timing 产生报告 之 -input_pins 选项

今天,我们再学习一点点 后仿真相关技能。 那就是,了解 report_timing 中的 -include_hierarchical_pins 选项。 如果我们仅仅使用如下命令,执行后会发现: pt_shell> report_timing -from FF1/CK -to FF2/d -delay_type max -include_hierarchical_pins 我们使用命…

【数据库】Mysql 批量变更所有字段类型为varchar的字符集

生成变更语句 SELECT CONCAT(ALTER TABLE , TABLE_NAME, MODIFY , COLUMN_NAME, , COLUMN_TYPE, , CHARACTER SET utf8 COLLATE utf8_general_ci , CASE WHEN IS_NULLABLE YES THEN NULL DEFAULT NULL WHEN IS_NULLABLE NO AND ISNULL(COLUMN_DEFAULT) THEN NOT NULL EL…

什么是持续集成(持续交付、部署)

文章目录 1 持续集成1.1 持续集成的好处1.2 持续集成的目的1.3 没有持续集成的状况 2 持续交付3 持续部署4 持续交付和持续部署的区别 1 持续集成 持续集成&#xff08;Continuous integration&#xff0c;简称CI&#xff09;&#xff0c;简单来说持续集成就是频繁地&#xff…

数字孪生网络 (DTN)关键技术分析

数字孪生网络 (DTN): 概念、架构及关键技术 摘要 随着5G商用规模部署和下一代互联网IPv6的深化应用&#xff0c;新一代网络技术的发展引发了产业界的广泛关注。智能化被认为是新一代网络发展的趋势&#xff0c;为数字化社会的信息传输提供了基础。面向数字化、智能化的新一代网…

【Linux篇】Linux命令基础

目录 1. Linux的目录结构 1.1 Linux的目录结构 1.2 /在Linux系统中的表示 2. linux命令基础 2.1 什么是命令和命令行 2.2 Linux命令的通用格式 2.3 ls命令 2.3.1 ls命令的参数的作用&#xff1a; 2.3.2 ls命令的选项 2.3.3 命令的选项组合使用 2.4 cd切换工作目录 2…

【微信小程序】使用 npm 包 - API Promise化-- miniprogram-api-promise

1. 基于回调函数的异步 API 的缺点 默认情况下&#xff0c;小程序官方提供的异步 API 都是基于回调函数实现的&#xff0c;例如&#xff0c;网络请求的 API 需要按照如下的方式调用&#xff1a; 缺点&#xff1a;容易造成回调地狱的问题&#xff0c;代码的可读性、维护性差&a…