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

6 网络

6 网络

  • 1、概念
  • 2 IP地址
  • 3、套接字
  • 4、TCP协议
    • 4.1 TCP协议的基本特征
    • 4.2 建立连接
    • 4.4 终止连接
    • 4.5 编程模型
  • 5、UDP协议
    • 5.1 UDP协议的基本特性
    • 5.2 常用函数
    • 5.3 UDP通信模型
  • 6、域名解析

1、概念

计算机网络是实现资源共享和信息传递的计算机系统
ISO/OSI网络协议模型
在这里插入图片描述

TCP/IP协议
在这里插入图片描述

·应用程序负责组织的通常都是与业务相关的数据内容,而要想把这些数据内容通过网络发送出去,就要将其自上向下地压入协议栈,每经历一个协议层,就会对数据做一层封包,每一层输出的封包都是下一层输入的内容,消息包沿着协议栈的运动形成了消息流。
·当从网络上接收数据时,过程刚好相反,消息包自下向上地流经协议栈,每经历一个协议层,就会对输入的数据解一层封包,经过层层解包以后,应用程序最终得到的将只是与业务相关的数据内容

2 IP地址

  • 什么是P地址?
    IP地址,是IP协议提供的一种统一的地址格式,为互联网上的每个网络和每台主机分配一个逻辑地址,借以消除物理地址所带来的差异性
  • IP地址如何表示?
    在计算机内部,IP地址用一个32位无符号整数表示,如:0x01020304。
    人们更习惯使用点分十进制字符串表示,如:1.2.3.4。字符串形式的从左到右,对应整数形式的从高字节到低字节。注意这里所说的高低指的是数位高低而非地址高低
  • 什么是IP地址分级?
    A级地址:以0为首的8位网络地址+24位本地地址
    B级地址:以10为首的16位网络地址+16位本地地址
    C级地址:以110为首的24位网络地址+8位本地地址
    D级地址:以1110为首的32位多播地址
    例如:某台计算机的IP地址:192.168.182.48,写成整数形式:11000000 10101000 10110110 00110000
    代表的是C级地址,网络地址:192.168.182.0,本地地址:48
  • 子网掩码
    • 借助子网掩码可以快速帮助我们区定IP地址的网络地址和本地地址
      • 以IP地址:192.168.182.48,子网掩码:255.255.255.0为例
        网络地址=IP地址&子网掩码
        192.168.182.48 & 255.255.255.0 = 192.168.182.0
        本地地址=IP地址&~子网掩码
        192.168.182.48 & 0.0.0.255 = 0.0.0.48

3、套接字

在这里插入图片描述

套接字代表着主机的通信能力
套接字接口库规定在网络传输过程中采用网络字节序,也就是大端字节序,
而本机数据可能是小短字节序
- 小端字节序:数据的低位存放在低地址
- 大端字节序:数据的低位存放在高地址

4、TCP协议

TCP提供客户机与服务器的连接

4.1 TCP协议的基本特征

一个完整TCP通信过程需要依次经历三个阶段

  • 首先,客户机必须建立与服务器的连接
  • 然后,凭借已建立好的连接,通信双方相互交换数据
  • 最后,客户机与服务器双双终止连接,结束通信过程
    TCP保证数据传输的可靠性
  • TCP的协议栈底层在向另一端发送数据时,会要求对方在一个给定的时间窗口内返回确认。如果超过了这个时间窗口仍没有收到确认,则TCP会重传数据并等待更长的时间。只有在数次重传均告失败以后,TCP才会最终放弃。TCP含有用于动态估算数据往返时间(Round-Trip Time,RTT)的算法,因此它知道等待一个确认需要多长时间
    TCP保证数据传输的有序性
  • TCP的协议栈底层在向另一端发送数据时,会为所发送数据的每个字节指定一个序列号。即使这些数据字节没有能够按照发送时的顺序到达接收方,接收方的TCP也可以根据它们的序列号重新排序,再把最后的结果交给应用程序
    TCP是全双工的
  • 在给定的连接上,应用程序在任何时候都既可以发送数据也可以接收数据。因此,TCP必须跟踪每个方向上数据流的状态信息,如序列号和通告窗口的大小

4.2 建立连接

三路握手

  • 客户机的TCP协议栈向服务器发送一个SYN分节,告知对方自己将在连接中发送数据的初始序列号
  • 服务器的TCP协议栈向客户机发送一个单个分节,其中不仅包括对客户机SYN分节的ACK应答,还包含服务器自己的SYN分节,以告知对方自己在同一连接中发送数据的初始序列号
  • 客户机的TCP协议栈向服务返回ACK应答,以表示对服务器所发SYN的确认
    在这里插入图片描述

tcp包头结构,有20个字节,其中2个字节的源端口、2个字节的目的端口、4字节的序号、4字节的确认号等等共计20个字节的数据
在这里插入图片描述

三次握手的解释:
① 客户机首先向服务器发送数据包,数据包中的SYN的比特位是1,并且在序号位置指定一个数字,假定为100
② 服务器收到客户机发来的数据包,其中SYN的比特位是1,那么服务器就会应答一个数据包,数据包里的ACK比特位置1,代表一种应答,并且在确认号这里会将收到的序号+1,这里是101,代表服务器真的收到了客户机的数据包,然后将序号指定一个数字假定是200,并且将SYN比特位置1,一起发送给客户机
③ 客户机收到服务器发来的数据包,首先检查数据包中的ACK和确认号是否正确,然后会向服务器应答一个数据包,其中ACK比特位置1,代表是对服务器的应答,确认号填写收到的序号+1,这里是201,发送给服务器,代表客户机真的收到了服务器的数据包
④ 服务器收到数据包,检查ACK和确认号,至此连接建立

接口## 4.3 交换数据

  • 一旦连接建立,客户机即可构造请求包并发往服务器,服务器接收并处理来自客户机的请求包,构造响应包
  • 服务器向客户机发送响应包,同时捎带对客户机请求包的ACK应答。
  • 客户机接收来自服务器的响应包,同时向对方发送ACK应答
    在这里插入图片描述

4.4 终止连接

四次挥手

  • 客户机或者服务器主动关闭连接,TCP协议栈向对方发送FIN分节,表示数据通信结束。如果此时尚有数据滞留于发送缓冲区中,则FIN分节跟在所有未发送数据之后
  • 接收到FIN分节的另一端执行被动关闭,-方面通过TCP协议栈向对方发送ACK应答,另一方面向应用程序传递文件结束符
  • 一段时间以后,方才接收到FIN分节的进程关闭自己的连接,同时通过TCP协议栈向对方发送FIN分节
  • 对方在收到FIN分节后发送ACK应答
    四次挥手的解释
    ① 客户机关闭套接字之后,客户机首先向服务器发送一个数据包,其中FIN比特位置1
    ② 服务器收到客户机发来的数据包,其中FIN比特位为1,向客户机回传一个应答,其中ACK置1
    ③ 服务器关闭对应的套接字操作之后,服务器向客户机发送一个数据包,其中FIN比特位置1
    ④ 客户机收到服务器发来的数据包,其中的FIN比特位为1,向服务器回传一个应答,其中ACK置1
    ⑤ 至此连接断开,通信终止

4.5 编程模型

在这里插入图片描述

  • 相关函数
    1:socket 创建套接字
// 头文件 sys/socket.h
int socket(int domain,int type,int protocol);
- 功能:创建套接字
- 参数:- domain:通信域,协议族,可取以下值:PF_LOCAL/PF_UNIX - 本地套接字,进程间通信PF_INET - 基于IPV4的网络通信PF_INET6 - 基于IPv6的网络通信PF_PACKET - 基于底层包的网络通信- type:套接字类型,可取以下值:SOCK_STREAM - 流式套接字,基于TCP协议SOCK_DGRAM - 数据报套接字,基于UDP协议SOCK_RAW - 原始套接字,工作在传输层以下- protocol:特殊协议,对于流式和数据报套接字而言,只能取0
- 返回值:成功返回表示套接字对象的文件描述符,失败返回-1

2:相关结构体

/*套接字接口库通过地址结构定位一个通信主体,可以是一个文件,可以是一台远程主机,也可以是执行者自己 */
// 基本地址结构,本身没有实际意义,仅用于泛型化参数
struct sockaddr{sa_family_t sa_family; // 地址族char sa_data\[14\]; // 地址值
}
// 本地地址结构,用于AF_LOCAL/AF_UNIX域的本地通信
struct sockaddr_un{sa_family_t sun_family;// 地址族(AF_LOCAL/AF_UNIX)char sun_path\[\];// 本地套接字文件的路径
}
// 网络地址结构,用于AF_INET域的IPV4写径通信
struct sockaddr_in{sa_family_t sin_family;∥地址族(AF_INET)in_port_t sin_port; //端口号(0~65535) - unsigned shortstruct in_addr sin_addr;//IP地址 - unsigned int
}
// 网络地址结构,用于AF_INET域的IPV4网络通信
struct in_addr{in_addr_t s_addr;
}
typedef uint16_t in_port_t; //无符号16位整数
typedef uint32_t in_addr_t; //无符号32位整数

3:字节序转换函数

uint32_t htonl(uint32_t hostlong); //长整形主机字节序到网络字节序
uint32_t ntohl(uint32_t netllong); //长整形网络字节序到主机字节序
uint16_t htons(uint16_t hostshort); //短整形主机字节序到网络字节序
uint16_t ntohs(uint16_t netshort); //短整型网络字节序到主机字节序
in_addr_t inet_addr(char const* ip); // 点分十进制字符串地址 -> 网络字节序形式整数地址
int inet_aton(char const* ip,struct in_addr* nip); //点分十进制字符串地址 -> 网络字节序形式整数地址
char* inet_ntoa(struct in_addr nip); //网络字节序形式整数地址 -> 点分十进制字符串地址

4:bind 将套接字和本机的地址结构绑定在一起

// 头文件 sys/socket.h
int bind(int sockfd,struct sockaddr const* addr,socklen_t addrlen);
- 功能:将套接字和本机的地址结构绑定在一起
- 参数:- sockfd:套接字描述符。- addr:自己的地址结构。- addrlen:地址结构的字节数
- 返回值:成功返回0,失败返回-1

5:listen 启动侦听

// 头文件 sys/socket.h
int listen(int sockfd,int backlog)
- 功能:启动侦听:在指定套接字上启动对连接请求的侦听功能
- 参数:- sockfd:套接字描述符,在调用此函数之前是一个主动套接字,是不能感知连接请求的,在调用此函数并成功返回之后,是一个被动套接字,具有感知连接请求的能力。- backlog:未决连接请求队列的最大长度,一般取不小于1024的值。
- 返回值:成功返回0,失败返回-1

6:accept

// 头文件 sys/socket.h
int accept(int sockfd,struct sockaddr* addr,socklen_t* addrlen);
- 功能:等待并接受连接请求,在指定套接字上阻塞,直到连接建立完成。
- 参数:- sockfd:侦听套接字描述符- addr:输出连接请求发起方的地址信息- addrlen:输出连接请求发起方的地址信息字节数
- 返回值:成功返回可用于后续通信的连接套接字描述符,失败返回-1
  • 案例
// tcp 服务器
#include <stdio.h>
#include <ctype.h> // toupper
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <sys/socket.h> // 网络相关
#include <sys/types.h>// 网络相关
#include <arpa/inet.h>// 网络相关
#include <sys/wait.h>// 收尸
void sigfun(int signum){printf("服务器:收尸\n");for(;;){pid_t pid = waitpid(-1,NULL,WNOHANG);if(pid == -1){if(errno == ECHILD){printf("没有子进程了\n");break;}else{perror("waitpid");return ;}}else if(pid == 0){printf("%d进程在运行\n",getpid());break;}else{printf("%d进程:回收了%d进程的僵尸\n",getpid(),pid);}}
}int main(){printf("服务器设置信号量\n");if(signal(SIGCHLD,sigfun)==SIG_ERR){ // 对17号信号做捕获处理perror("signal");return -1;}printf("服务器:创建套接字\n");int sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd == -1){perror("socket");return -1;}printf("服务器:组织地址结构\n");struct sockaddr_in ser;// IPV4的网络地址结构ser.sin_family = AF_INET;ser.sin_port = htons(8980);// 端口号,这里需要做字节序转换,因为TCP协议栈需要这个端口ser.sin_addr.s_addr = inet_addr("192.168.174.152");printf("服务器:绑定套接字和地址结构\n");if(bind(sockfd,(struct sockaddr*)&ser,sizeof(ser)) == -1){perror("bind");return -1;}printf("服务器:启动侦听\n");if(listen(sockfd,1024)==-1){// 监听,用于接收客户端的连接请求(3次握手)perror("listen");return -1;}for(;;){printf("服务器:等待连接\n");struct sockaddr_in cli; //用于输出客户端的地址结构socklen_t len = sizeof(cli); // 用来输出地址结构的大小int conn = accept(sockfd,(struct sockaddr*)&cli,&len); // 用于完成与客户端的3次握手中的后两次if(conn == -1){ // conn 是用来和客户端通信用的,每接入一个客户端,就会生成一个新的connperror("accept");return -1;}printf("服务器:接收到%s:%hu的客户端的连接\n",inet_ntoa(cli.sin_addr),ntohs(cli.sin_port));printf("服务器:业务处理\n");pid_t pid = fork();if(pid == -1){perror("fork");return -1;}if(pid == 0){close(sockfd);// 关掉从父进程复制过来的通信套接字for(;;){// 接收客户端发送的小写的串char buf[64]={};ssize_t size = read(conn,buf,sizeof(buf)-1);if(size == -1){perror("read");close(conn);return -1;}//客户端断开连接时if(size == 0){break;}// 转大写for(int i=0;i<strlen(buf);i++){buf[i]=toupper(buf[i]);}// 将大写的串回传给客户端if(write(conn,buf,strlen(buf))==-1){perror("write");close(conn);return -1;}}printf("服务器:关闭通信套接字\n");close(conn);return 0;}close(conn);// 子进程已经复制了这个套接字,父进程自己的直接关掉即可}printf("关闭服务器\n");close(sockfd);return 0;
}

7:connect 将套接字和对方的地址结构连接在一起

// 头文件 sys/socket.h
int connect(int sockfd,struct sockaddr const* addr,socklen_t addrlen);
- 功能:将套接字和对方的地址结构连接在一起
- 参数:- sockfd:套接字描述符- addr:对方的地址结构- addrlen:地址结构的字节数
- 返回值:成功返回0,失败返回-1

8:send 发送数据

// 头文件 sys/socket.h
ssize_t send(int sockfd,void const* buf,size_t count,int flags);
- 功能:发送数据
- 参数:- 若flags取0则与write函数完全等价,另外也可取以下值:MSG_DONTWAIT - 以非阻塞方式接收数据。MSG_OOB - 接收带外数据。MSG_DONTROUTE - 不查路由表,直接在本地网络中寻找目的主机
- 返回值:成功返回实际发送的字节数,失败返回-1

9:recv 接收数据

// 头文件 sys/socket.h
ssize_t recv(int sockfd,void* buf,size_t count,int flags);
- 功能:接收数据
- 参数:- 若flags取0则与read函数完全等价,另外也可取以下值:MSG_DONTWAIT - 以非阻塞方式接收数据。MSG_OOB - 接收带外数据。MSG_WAITALL - 等待所有数据,即不接收到count字节就不返回。
- 返回值:成功返回实际接收到的字节数,失败返回-1
  • 案例
// 基于tcp客户端的连接
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>int main(){printf("客户端:创建套接字\n");int sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd == -1){perror("socket");return -1;}printf("客户端:组织服务器的地址结构\n");struct sockaddr_in ser;ser.sin_family = AF_INET;ser.sin_port = htons(8980);ser.sin_addr.s_addr = inet_addr("192.168.174.152");printf("客户端:发起连接\n");if(connect(sockfd,(struct sockaddr*)&ser,sizeof(ser))==-1){perror("connect");return -1;}printf("客户端:业务处理\n");for(;;){// 发送小写的串char buf[64]={};fgets(buf,sizeof(buf),stdin);if(strcmp(buf,"!\n")==0){break;}if(send(sockfd,buf,strlen(buf),0)==-1){perror("send");return -1;}// 接收大写的串if(recv(sockfd,buf,sizeof(buf)-1,0)==-1){perror("recv");return -1;}// 显示printf("%s",buf);}printf("客户端:关闭套接字\n");close(sockfd);return 0;
}

5、UDP协议

5.1 UDP协议的基本特性

  • UDP不提供客户机与服务器的连接
    • UDP的客户机与服务器不必存在长期关系。一个UDP的客户机在通过一个套接字向一个UDP服务器发送了一个数据报之后,马上可以通过同一个套接字向另一个UDP服务器发送另一个数据报。同样,一个UDP服务器也可以通过同一个套接字接收来自不同客户机的数据报
  • UDP不保证数据传输的可靠性和有序性
    • UDP的协议栈底层不提供诸如确认、超时重传、RTT估算以及序列号等机制。因此UDP数据报在网络传输的过程中,可能丢失,也可能重复,甚至重新排序。应用程序必须自己处理这些情况
  • UDP不提供流量控制
    • UDP的协议栈底层只是一味地按照发送方的速率发送数据,全然不顾接收方的缓冲区是否装得下
  • UDP是全双工的
    • 在一个UDP套接字上,应用程序在任何时候都既可以发送数据也可以接收数据

5.2 常用函数

1:recvfrom 从哪里接收数据

// 头文件 sys/socket.h
ssize_t recvfrom(int sockfd,void* buf,size_t count,int flags,struct sockaddr* src_addr,socklen_t* addrlen);
- 功能:从哪里接收数据
- 参数:- 前四个参数和函数recv相同- src_addr:输出源主机的地址信息- addrlen:输入输出源主机的地址信息的字节数。
- 返回值:成功返回实际接收的字节数,失败返回-1

2:sendto 发送数据到哪里

// 头文件 sys/socket.h
ssize_t sendto(int sockfd,void const* buf,size_t count,int flags,struct sockaddr const* dest_addr,socklen_t addrlen);
- 功能:发送数据到哪里
- 参数:- 前四个参数和函数send相同- dest_addr:目的主机的地址信息。- addrlen:目的主机的地址信息的字节数。
- 返回值:成功返回实际发送的字节数,失败返回-1

5.3 UDP通信模型

在这里插入图片描述

  • 服务器
// udp 服务器
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys//types.h>
#include <arpa/inet.h>int main(){printf("服务器:创建套接字\n");int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(sockfd == -1){perror("socket");return -1;}printf("服务器:组织地址结构\n");struct sockaddr_in ser;ser.sin_family = AF_INET;ser.sin_port = htons(8090);ser.sin_addr.s_addr=inet_addr("192.168.174.152");printf("服务器:绑定套接字和地址结构\n");if(bind(sockfd,(struct sockaddr*)&ser,sizeof(ser))==-1){perror("bind");return -1;}printf("服务器:业务处理\n");for(;;){char buf[64]={};struct sockaddr_in cli;socklen_t len = sizeof(cli);if(recvfrom(sockfd,buf,sizeof(buf)-1,0,(struct sockaddr*)&cli,&len)==-1){perror("recvfrom");return -1;}// 转大写for(int i=0;i<strlen(buf);i++){buf[i] = toupper(buf[i]);}// 将大写的串回传到客户端if(sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*) &cli,len) == -1){perror("sendto");return -1;}}printf("服务器关闭套接字\n");close(sockfd);return 0;
}
  • 客户端
// UDP客户端
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
int main(){printf("客户端:创建套接字\n");int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(sockfd == -1){perror("socker");return -1;}        printf("客户端:组织服务器地址结构\n");struct sockaddr_in ser;ser.sin_family = AF_INET;ser.sin_port = htons(8090);ser.sin_addr.s_addr = inet_addr("192.168.174.152");printf("客户端:业务处理\n");for(;;){// 向客户端发送小写的串char buf[64] = {};fgets(buf,sizeof(buf),stdin);if(strcmp(buf,"!\n")==0){break;}if(sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&ser,sizeof(ser))==-1){perror("sendto");return -1;}// 接收服务器回传if(recv(sockfd,buf,sizeof(buf)-1,0)==-1){perror("recv");return -1;}// 显示printf("客户端:收到%s",buf);}// 关闭套接字close(sockfd);return 0;
}

6、域名解析

  • IP地址是网络上标识站点的数字地址,为了方便记忆,采用域名来代替1P地址标识站点地址
  • 域名解析就是域名到IP地址的转换过程。域名的解析工作由DNS服务器完成
  • 当应用过程需要将一个主机域名映P地址时,就调用域名解析函数,解析函数将待转换的域名放在DNS请求中,以UDP报文方式发给本地域名服务器。本地的域名服务器查到域名后,将对应的IP地址放在应答报文中返回。
    相关函数
    gethostbyname 获取主机信息
// 头文件 netdb.h
struct hostent* gethostbyname(char const* host_name);
- 功能:通过参数所传的主机域名,获取主机信息
- 参数:- host_name 主机域名
- 返回值:函数执行成功返回表示主机信息的结构体指针,失败返回NULL
- 注意,该函数需要再联网情况下使用

结构

struct hostent{char *h_name; //主机官方名char **h_aliases; //主机别名表int h_addrtype; //地址类型int h_length; //地址长度char **h_addr_list; //IP地址表
};
  • 案例
#include <stdio.h>
#include <unistd.h>
#include <netdb.h>
#include <arpa/inet.h>
int main(int argc,char* argv[]){struct hostent* h = gethostbyname(argv[1]);if(h==NULL){perror("gethostbyname");return -1;}printf("主机官方名\n");printf("\t%s\n",h->h_name);printf("主机别名\n");for(char **pp = h->h_aliases;*pp;pp++){printf("\t%s\n",*pp);}printf("IP地址表\n");for(struct in_addr **pp=(struct in_addr**)h->h_addr_list;*pp;pp++){printf("\t%s\n",inet_ntoa(**pp));}return 0;
}
  • 创建http请求发送
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>int main(){// 创建套接字int sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd == -1){perror("socket");return -1;}// 组织百度服务器的地址结构struct sockaddr_in ser;ser.sin_family = AF_INET;ser.sin_port = htons(80);ser.sin_addr.s_addr = inet_addr("36.155.132.76");// 向百度服务器发起连接if(connect(sockfd,(struct sockaddr*)&ser,sizeof(ser))==-1){perror("connect");return -1;}// 组织http请求并发送给百度服务器char request[1024] ={};sprintf(request,"GET / HTTP/1.1\r\n""Host: www.baidu.com\r\n""Accept: */*\r\n""Connection: close\r\n\r\n");if(send(sockfd,request,strlen(request),0)==-1){perror("send");return -1;}// 接收百度服务器回传的响应for(;;){char respond[1024] = {};ssize_t size = recv(sockfd,respond,sizeof(respond)-1,0);if(size == -1){perror("recv");return -1;}if(size == 0){break;}printf("%s",respond);}printf("\n");close(sockfd);return 0;
}

相关文章:

6 网络

6 网络 1、概念2 IP地址3、套接字4、TCP协议4.1 TCP协议的基本特征4.2 建立连接4.4 终止连接4.5 编程模型 5、UDP协议5.1 UDP协议的基本特性5.2 常用函数5.3 UDP通信模型 6、域名解析 1、概念 计算机网络是实现资源共享和信息传递的计算机系统 ISO/OSI网络协议模型 TCP/IP协…...

SQL中CASE WHEN的用法

CASE WHEN的用法 1. CASE WHEN数据转换 说明&#xff1a;使用CASE WHEN我们可以将范围的数据转换成特定的值来表达; 假如&#xff1a;有一个员工表Employee(employee_id,department_id.salary,name,age)&#xff1b; 需求&#xff1a;需要根据薪资情况来评定等级&#xff1a;…...

CTF-Web习题:[GXYCTF2019]Ping Ping Ping

题目链接&#xff1a;[GXYCTF2019]Ping Ping Ping 解题思路 访问靶机&#xff0c;得到如下页面&#xff0c;类似于URL参数 尝试用HackBar构造url传输过去看看 发现返回了ping命令的执行结果&#xff0c;可以猜测php脚本命令是ping -c 4 $ip&#xff0c;暂时不知道执行的函数…...

python+vue3+onlyoffice在线文档系统实战20240725笔记,首页开发

解决遗留问题 内容区域的高度没有生效&#xff0c;会随着菜单的高度自动变化。 解决方案&#xff1a;给侧边加上一个最小高度。 首页设计 另一种设计&#xff1a; 进来以后&#xff0c;是所有的文件夹和最近的文件。 有一张表格&#xff0c;类似于Windows目录详情&…...

映美精彩色相机IFrameQueueBuffer转halcon的HObject

1.之前写了黑白IFrameQueueBuffer转halcon的HObject&#xff0c;下载这边文件写&#xff0c;彩色IFrameQueueBuffer转halcon的HObject 2.相机的部署跟黑白的一样&#xff0c;不同的是取图的格式改变 if (CamerTakeImageOne._camer_take_image_static._camer_is_exit){textbox_m…...

写代码对人的影响

1 代码是需要跑起来的&#xff0c;不能你写了一段代码运行不了 2 代码过程中有大量的bug&#xff0c;经常异常报错&#xff0c;你需要花费时间去解决 对人的影响就是解决问题的态度得到强化&#xff0c;解决问题要比坚持正确困难&#xff0c;坚持正确只是需要自然而然的努力&…...

Hive-基础介绍

简介 Apache Hive是一款数据仓库系统 功能 可以将存储在Hadoop(HDFS)中的数据映射为一张数据库表。核心是将HQL语句转化为MapRece程序&#xff0c;然后提交到Hadoop执行。 组件 用户接口&#xff1a;CLI(shell命令行)、WebGUI、Thrift Server元数据存储(Metastore)&#x…...

网站如何从0-1搭建部署蓝图介绍

第一步&#xff1a;网站规划 确定网站目的&#xff1a;明确网站的目标和预期的受众。内容规划&#xff1a;决定网站将包含哪些内容和功能。技术需求分析&#xff1a;确定所需的技术栈&#xff0c;例如前端和后端技术。 第二步&#xff1a;设计 草图和布局&#xff1a;绘制网…...

面向对象(封装)练习题 巩固一下啦!

# 设计一个类&#xff0c;用来描述手机 class Phone:# 提供私有成员变量&#xff1a;__is_5g_enable__is_5g_enable False # 5g状态# 提供私有成员方法&#xff1a;__check_5gdef __check_5g(self):if self.__is_5g_enable:print("5g开启")else:print("5g关闭…...

一些问题 7/28

get post可以public吗 在Java Servlet中&#xff0c;doGet()和doPost()方法的访问修饰符通常是public&#xff0c;因为这些方法需要被Servlet容器&#xff08;如Tomcat&#xff09;调用。 如果将这些方法声明为private或protected&#xff0c;Servlet容器将无法访问它们&…...

昇思MindSpore 应用学习-基于MobileNetv2的垃圾分类

基于MobileNetv2的垃圾分类 本文档主要介绍垃圾分类代码开发的方法。通过读取本地图像数据作为输入&#xff0c;对图像中的垃圾物体进行检测&#xff0c;并将检测结果图片保存到文件中。 1、实验目的 了解熟悉垃圾分类应用代码的编写&#xff08;Python语言&#xff09;&…...

matlab 常用数据类型的转换

目录 一、数据类型1、整型2、浮点型3、逻辑型4、元胞数组5、结构体 二、数据类型转换三、图像数据类型转换四、参考链接 一、数据类型 1、整型 int和unit都是整型&#xff0c;只是前一个有符号&#xff0c;后一个没有符号&#xff0c;比如在16位系统中&#xff0c;int范围是-3…...

Cocos Creator2D游戏开发(6)-飞机大战(4)-敌机产生

敌机产生&玩家发射子弹 敌机产生: 创建一个空节点 创建一个敌机预制体 把敌机图片拖入预制体内 使用代码生成敌机 让敌机动起来 创建一个预制体enemy_prefab双击预制体enemy_prefab,然后拖入一个敌机图片,设置好方向和尺寸,一定要记得保存然后关闭(场景编辑器里面的保存)…...

Hugo部署到Vercel踩大坑——全是XML文件?

问题描述 部署到Vercel全都是XML文件 Vercel是著名PAAS服务&#xff0c;相比于 Github Pages&#xff0c;其中国大陆可直接访问&#xff0c;因此尝试把Hugo站点发布到vercel中&#xff0c;部署后遇到问题&#xff0c;所有页面都为xml文件&#xff0c;如下所示&#xff1a; Ve…...

2024 暑假友谊赛-热身1

[ABC102D] Equal Cut - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路:找在区间[2,n-1]中找到i,j,k三个点,把序列分割成4个区间:[1,i],[i1,j],[j1,k],[k1,n] 暴力的做法是枚举i,j,k加上前缀和是o(n^3)的 key:"考虑枚举处于中间的j&#xff0c;然后用i平衡左两个区间,…...

Nginx系列-11 HTTP消息处理流程

背景 了解Nginx处理HTTP请求的11个阶段&#xff0c;有助于理解和配置nginx、自定义模块、基于lua模块自定义功能。按如下配置&#xff0c;执行"curl http://localhost:8001/query/test.html"&#xff0c;如果读者对结果不是很确定&#xff0c;建议阅读本文。 serve…...

前端知识--前端访问后端技术Ajax及框架Axios

一、异步数据请求技术----Ajax Ajax是前端访问后端的技术&#xff0c;为异步请求&#xff08;不刷新页面&#xff0c;请求数据&#xff0c;只更新局部数据&#xff09;。 例如&#xff1a;在京东网站中搜索电脑&#xff0c;就会出现一些联想搜索&#xff0c;但此时页面并没有…...

【前端/js】使用js读取本地文件(xml、二进制)内容

目录 说在前面FileReaderDOMParser文本文件二进制文件 说在前面 浏览器版本&#xff1a;Microsoft Edge 126.0.2 (正式版本) (64 位) FileReader MDNFileReader 接口允许 Web 应用程序异步读取存储在用户计算机上的文件&#xff08;或原始数据缓冲区&#xff09;的内容&#x…...

初步入门C ++之类的概念

文章目录 0 Hello World!1 编译过程2 类2.1 类的概念2.2 构造函数与析构函数 0 Hello World! #include <iostream> //相当于#include <stdio.h>int main(int argc, char argv[]) {char c;std::cout << "Hello World!\n" <<…...

什么是技术作家风格指南?

技术写作风格指南旨在提供必要的格式风格&#xff0c;以帮助技术作家为读者创建引人入胜且一致的内容。然而&#xff0c;技术写作与普通的自由写作有很大不同。目的是将复杂的技术主题分解为易于理解的内容&#xff0c;以帮助读者了解如何使用产品或服务。 在本文中&#xff0…...

WebGIS学习——Cesium|Javascript

1.Cesium学习什么&#xff1a;Cesium实战项目说明-CSDN博客 2.Cesium绘制图形(箭头等):Cesium 态势标绘 _cesium态势标绘-CSDN博客 3.CesiumThree集成 4.Cesium深度图相关&#xff1a;Cesium离屏渲染深度图实验_cesium 离屏渲染-CSDN博客 5.洪涝&#xff1a;cesium淹没分析…...

Qt,获取其他.exe文件的标准输出流的信息(printf/print的输出信息)

比如&#xff0c;通过Python编写爬虫软件功能是运行程序获取豆瓣电影排行榜信息&#xff0c;并通过print打印出来。将其打包成.exe,通过Qt来调用&#xff0c;并获取到.exe程序运行的结果 简单示例代码&#xff1a; // 创建 QProcess 对象QProcess process;// 连接信号槽以获取…...

LeetCode 热题 HOT 100 (010/100)【宇宙最简单版】

【链表】No. 0206 反转链表 【简单】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#xf…...

Ubuntu24.04安装mysql-server小计,解决mysql_secure_installation时不能重置密码的问题

Ubuntu24.04安装mysql-server小计&#xff0c;解决mysql_secure_installation时不能重置密码的问题 为什么要写这往篇文章&#xff1f; 一般情况下&#xff0c;我安装mysql都用源码编译&#xff0c;以此方便安装更多自定义插件&#xff0c;但这次只需要安装一台开发机&#x…...

unity3d:TabView,UGUI多标签页组件,TreeView树状展开菜单

概述 1.最外层DataForm为空壳编辑数据用。可以有多个DataForm&#xff0c;例如福利DataForm&#xff0c;抽奖DataForm 2.Menu层为左边栏层&#xff0c;每个DataForm可以使用不同样式的MenuForm预制体 3.DataForm中使用ReorderList&#xff0c;可排列配置 4.有定位功能&#xf…...

go语言map底层及扩容机制原理详解(下)

前言 上文对Go map的底层数据结构有所了解&#xff0c;并对其扩容机制的步骤进行简略的描述。本文将会详细地去解释Go map扩容机制的详细原理。 1. 触发扩容操作 在go语言中&#xff0c;当我们插入一个元素到hmap时&#xff0c;会有以下两种情况&#xff1a; 若元素存在&…...

网络协议二 : 使用Cisco Packet Traceer工具模拟网络环境,集线器,网桥,交换机,路由器,IP,同一网段

1. 安装 Cisco Packet Tracer baidu 网盘地址&#xff0c;感谢大神分享 安装&#xff0c;破解&#xff0c;中文化&#xff0c;都有说明&#xff0c;建议使用7.x的那个版本&#xff0c;感觉比8.x的翻译要完整一点 https://pan.baidu.com/s/18iWBOfhJJRhqgQqdNQcfMQ?pwddcch#…...

Aria2 任意文件写入漏洞

目录 Aria2介绍漏洞描述漏洞复现 Aria2介绍 Aria2是一个在命令行下运行&#xff0c;多协议&#xff0c;多来源下载工具&#xff08;HTTP / HTTPS&#xff0c;FTP&#xff0c;BitTorrent&#xff0c;Metalink&#xff09;&#xff0c;内建XML-RPC用户界面。Aria提供RPC服务器&a…...

成为git砖家(4): git status 命令简介

1. untracked 和 tracked 状态 Remember that each file in your working directory can be in one of two states: tracked or untracked. Tracked files are files that were in the last snapshot, as well as any newly staged files; they can be unmodified, modified, o…...

2-48 基于matlab的EM算法聚类可视化程序

基于matlab的EM算法聚类可视化程序&#xff0c;通过期望最大化算法&#xff08;EM&#xff09;优化类别间距&#xff0c;使得类别间距最大、类内间距最小。输出聚类前后结果及收敛曲线。程序已调通&#xff0c;可直接运行。 2-48 期望最大化算法&#xff08;EM&#xff09; 聚类…...