大字符串找小字符串
调试
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