10_libpcap以及libnet

news2025/1/9 23:32:37

知识点1【飞秋欺骗】

1、windwos安装飞秋 双击运行

2、ubuntu安装飞秋 sudo apt-get install iptux

ubuntu运行飞秋:iptux&

3、飞秋的格式:

版本:包编号:用户名:主机名:命令字:附加消息

飞秋的端口是2425固定的

1表示上线 32表示普通消息

1_iptux_0#5#2:8:edu:edu:259:edu

#include<stdio.h>
#include<sys/socket.h>
#include<netinet/ether.h>
#include <sys/ioctl.h>//ioctl
#include <net/if.h>//struct ifreq
#include <netpacket/packet.h>//struct sockaddr_ll
#include<unistd.h>//_exit
#include<string.h>//strncpy
#include <net/ethernet.h>//struct ether_header
#include <net/if_arp.h>//struct arphdr
#include <netinet/ip.h>//struct iphdr
#include <netinet/udp.h>//struct udphdr
void my_sendto(int sockfd, char *out, unsigned char *msg, int msg_len);
typedef struct
{
	u_int32_t saddr;//源IP
	u_int32_t daddr;//目的IP
	u_int8_t flag;//标记(0)
	u_int8_t type;//udp协议 17
	u_int16_t len;//长度
}WEIHDR;
unsigned short checksum(unsigned short *buf, int len)
{
	int nword = len/2;
	unsigned long sum;

	if(len%2 == 1)
		nword++;
	for(sum = 0; nword > 0; nword--)
	{
		sum += *buf;
		buf++;
	}
	sum = (sum>>16) + (sum&0xffff);
	sum += (sum>>16);
	return ~sum;
}
int main()
{
	//1、创建原始套接字
	int sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
	if(sockfd < 0)
	{
		perror("socket");
		return 0;
	}
	//获取要发送的消息
	printf("请输入要发送的消息:");
	char data[128]="1_iptux_0#5#2:123:edu:edu:32:loveyou";
	int data_len = strlen(data);
	//如果data_len不是偶数 补0为偶数
	if(data_len%2 != 0)//奇数
		data_len++;
	
	/*目的mac地址 XPmac*/
	unsigned char dst_mac[6]={0x70,0x5A,0x0F,0x63,0xF5,0x9D};//win_mac
	unsigned char dst_ip[4]={192,168,0,110};//win_ip
	unsigned char src_mac[6]={0x00,0x0c,0x29,0x9a,0xeb,0x23};//伪装的mac!!!!
	unsigned char src_ip[4]={192,168,0,105};//伪装的IP !!!!!
	
	
	unsigned char msg[1024]="";
	//1、组mac头部
	struct ether_header *eth_addr = (struct ether_header *)msg;
	//赋值目的mac地址
	memcpy(eth_addr->ether_dhost, dst_mac, 6);
	//赋值源mac地址
	memcpy(eth_addr->ether_shost, src_mac, 6);
	//赋值帧类型 
	eth_addr->ether_type = htons(0x0800);
	
	//2、组IP报文
	struct iphdr *ip_hdr = (struct iphdr *)(msg+14);
	ip_hdr->version = 4;//IPv4版本
	ip_hdr->ihl = 5;//IP头部长度 单位4B 所以赋值5其实就是5*4=20B
	ip_hdr->tos = 0;//服务类型
	ip_hdr->tot_len = htons(20+8+data_len);//总长度=IP首部长度+IP数据长度
	ip_hdr->id = htons(0);//标识
	ip_hdr->frag_off = htons(0);//标志 + 片偏移
	ip_hdr->ttl = 128;//64或128都可以 生命周期
	ip_hdr->protocol = 17;//udp 17   tcp 6
	ip_hdr->check = htons(0);//首部校验???? 后续校验
	memcpy(&ip_hdr->saddr, src_ip, 4);//源IP
	memcpy(&ip_hdr->daddr, dst_ip, 4);//目的IP
	//ip报文头部校验
	ip_hdr->check = checksum(ip_hdr, 20);
	
	//3、udp头部
	struct udphdr *udp_hdr = (struct udphdr *)(msg+14+20);
	udp_hdr->source = htons(2425);//源端口 !!!!
	udp_hdr->dest = htons(2425);//目的端口 !!!!
	udp_hdr->len = htons(8+data_len);//udp总长度=udp报文头+数据长
	udp_hdr->check = htons(0);//???? udp校验
	//将data拷贝到udp的数据部分
	memcpy(msg+14+20+8, data, data_len);
	
	//准备udp校验
	unsigned char wei_head[1024]="";
	WEIHDR *wei_hdr = (WEIHDR *)wei_head;
	memcpy(&wei_hdr->saddr, src_ip, 4);//源IP
	memcpy(&wei_hdr->daddr, dst_ip, 4);//目的IP
	wei_hdr->flag = 0;
	wei_hdr->type = 17;//协议
	wei_hdr->len = htons(8+data_len);//udp的总长度
	//将msg中的udp头部信息以及data数据 拷贝到为头部后方
	memcpy(wei_head+12, udp_hdr, 8+data_len);
	
	//校验udp: 为头部+udp头部+data部分
	udp_hdr->check = checksum(wei_head, 12+8+data_len);
	
	//发送arp请求帧数据
	my_sendto(sockfd, "eth0",msg, 14+20+8+data_len);
	
	sleep(5);
	close(sockfd);
	return 0;
}
void my_sendto(int sockfd, char *out, unsigned char *msg, int msg_len)
{
	//通过ioctl得到网络接口
	struct ifreq ethreq;
	strncpy(ethreq.ifr_name, out, IFNAMSIZ);
	if(-1 == ioctl(sockfd, SIOCGIFINDEX, &ethreq))
	{
		perror("ioctl");
		close(sockfd);
		_exit(-1);
	}
	
	//帧数据 出去的本地接口
	struct sockaddr_ll sll;
	bzero(&sll,sizeof(sll));
	sll.sll_ifindex = ethreq.ifr_ifindex;
	//2、发送组好报文的帧数据
	sendto(sockfd, msg, msg_len, 0, (struct sockaddr *)&sll, sizeof(sll));
}

知识点2【libpcap】接受收原始套接字的数据

1、Libpcap主要的作用

Libpcap主要的作用如下:

1、捕获各种数据包

列如:网络流量统计

2、过滤网络数据包

列如:过滤掉本地上的一些数据,类似防火墙

3、分析网络数据包

列如:分析网络协议,数据的采集

4、存储网络数据包

列如:保存捕获的数据以为将来进行分析

2、Libpcap的安装

sudo apt-get install libpcap-dev

需要的头文件:

#include <pcap.h>

编译的时候 -lpcap

3、libpcap开发实例

利用libpcap函数库开发应用程序的基本步骤:

1、打开网络设备

2、设置过滤规则(可选)

3、捕获数据

4、关闭网络设备

捕获网络数据包常用函数

1、pcap_lookupdev( )(可选) 查看设备名

2、pcap_open_live( ) 打开设备

3、pcap_lookupnet( )(可选) 获取的设备IP

4、pcap_compile( )、 pcap_setfilter( ) (可选) 设置过滤规则

5、pcap_next( 调用一次捕获一个报文 )、pcap_loop( 调用一次 不停捕获报文 ) 捕获数据

6、pcap_close( )

4、打开设备 获得设备的句柄

pcap_t *pcap_open_live(const char *device,int snaplen,int promisc,
int to_ms,char *ebuf)
功能:
打开一个用于捕获数据的网络接口
返回值:
返回一个Libpcap句柄
 
参数:
device:网络接口的名字
snaplen:捕获数据包的长度
promise:1代表混杂模式,其它非混杂模式
to_ms:等待时间
ebuf:存储错误信息

5、关闭句柄

void pcap_close(pcap_t *p)

功能:

关闭Libpcap操作,并销毁相应的资源

参数

   p:需要关闭的Libpcap句柄

返回值:

例如

const u_char *pcap_next(pcap_t *p,struct pcap_pkthdr *h)
功能:
捕获一个网络数据包
参数:
    p:Libpcap句柄
    h:数据包头
返回值:
    捕获的数据包的地址

 struct pcap_pkthdr结构体信息:记录接受数据的时间以及报文的长度

 案例:

#include<stdio.h>
#include <pcap.h>
int main()
{
	//1、创建一个pcap句柄
	pcap_t *pcap_handle = NULL;
	pcap_handle = pcap_open_live("eth0",1500,0,0,NULL);
	
	//2、接受数据
	struct pcap_pkthdr pck_hdr;//记录收到数据的时间和报文长度
	unsigned char *msg = NULL;//存放接受到的帧数据
	msg = pcap_next(pcap_handle, &pck_hdr);
	printf("报文长度:%u\n", pck_hdr.caplen);
	//msg:mac ip  udp/tcp  data
	//msg的mac地址解析 和 原始套接字一样
	//解析msg的mac地址
	char src_mac[18]="";
	char dst_mac[18]="";
	sprintf(dst_mac,"%02x:%02x:%02x:%02x:%02x:%02x", \
	msg[0],msg[1],msg[2],msg[3],msg[4],msg[5]);
	sprintf(src_mac,"%02x:%02x:%02x:%02x:%02x:%02x", \
	msg[0+6],msg[1+6],msg[2+6],msg[3+6],msg[4+6],msg[5+6]);
	printf("%s--->%s\n", src_mac, dst_mac);
	
	//关闭句柄
	pcap_close(pcap_handle);
	return 0;
}

运行结果:

7、循环的接受网络数据pcap_loop

int pcap_loop(pcap_t *p,int cnt,pcap_handler callback,u_char *user)
功能:
    循环捕获网络数据包,直到遇到错误或者满足退出条件;
    每次捕获一个数据包就会调用callback指示的回调函数,
    所以,可以在回调函数中进行数据包的处理操作
返回值:
    成功返回0,失败返回负数
参数:
    p:Libpcap句柄
    cnt:指定捕获数据包的个数,如果是-1,就会永无休止的捕获
    callback:回调函数
    user:向回调函数中传递的参数

回调函数如何定义: 

参数1:argument存放pcap_loop传递过来的user用户数据

参数2:packet_heaher 存放接收到的报文的时间以及长度

参数3:packet_content接收到的网络帧数据

案例:

#include<stdio.h>
#include <pcap.h>
//pcap_loop每收到一个报文 就会调用一次回调函数
void callback(u_char *arg, const struct pcap_pkthdr *packet_header, \
const u_char *packet_content)
{
	unsigned char *msg = packet_content;
	printf("报文长度:%u\n", packet_header->caplen);
	//解析msg的mac地址
	char src_mac[18]="";
	char dst_mac[18]="";
	sprintf(dst_mac,"%02x:%02x:%02x:%02x:%02x:%02x", \
	msg[0],msg[1],msg[2],msg[3],msg[4],msg[5]);
	sprintf(src_mac,"%02x:%02x:%02x:%02x:%02x:%02x", \
	msg[0+6],msg[1+6],msg[2+6],msg[3+6],msg[4+6],msg[5+6]);
	printf("%s--->%s\n", src_mac, dst_mac);
}
int main()
{
	//1、创建一个pcap句柄
	pcap_t *pcap_handle = NULL;
	pcap_handle = pcap_open_live("eth0",1500,0,0,NULL);
	
	//2、接受数据 带阻塞
	pcap_loop(pcap_handle, 5, callback, NULL);
	
	//关闭句柄
	pcap_close(pcap_handle);
	return 0;
}

 运行结果:

8、设置过滤规则 下面两个函数配合使用

pcap_compile: 将用户识别的规则 转换成 pcap识别的规则

pcap_setfilter:将pcap识别的规则 设置到pcap结束数据的句柄中

int pcap_compile(pcap_t *p,struct bpf_program *program,
char *buf,int optimize,bpf_u_int32 mask)
功能:
    编译BPF过滤规则
返回值:
    成功返回0,失败返回-1
参数:
    p:Libpcap句柄
    program:bpf过滤规则(pcap识别的规则)
    buf:过滤规则字符串(用户识别的规则  重心)
    optimize:优化
    mask:掩码
int pcap_setfilter(pcap *p,struct bpf_program*fp)
功能:
    设置BPF过滤规则
返回值:
    成功返回0,失败返回-1
参数:
    p:Libpcap句柄
    fp:BPF过滤规则

 过滤规则:

 

 案例:

#include<stdio.h>
#include <pcap.h>
//pcap_loop每收到一个报文 就会调用一次回调函数
void callback(u_char *arg, const struct pcap_pkthdr *packet_header, \
const u_char *packet_content)
{
	unsigned char *msg = packet_content;
	printf("报文长度:%u\n", packet_header->caplen);
	//解析msg的mac地址
	char src_mac[18]="";
	char dst_mac[18]="";
	sprintf(dst_mac,"%02x:%02x:%02x:%02x:%02x:%02x", \
	msg[0],msg[1],msg[2],msg[3],msg[4],msg[5]);
	sprintf(src_mac,"%02x:%02x:%02x:%02x:%02x:%02x", \
	msg[0+6],msg[1+6],msg[2+6],msg[3+6],msg[4+6],msg[5+6]);
	printf("%s--->%s\n", src_mac, dst_mac);
}
int main()
{
	//1、创建一个pcap句柄
	pcap_t *pcap_handle = NULL;
	pcap_handle = pcap_open_live("eth0",1500,0,0,NULL);
	
	//设置过滤规则
	struct bpf_program program;
	pcap_compile(pcap_handle,&program, "src port 9000", 0, 0xffffff00);
	pcap_setfilter(pcap_handle, &program);
	
	//2、接受数据 带阻塞
	pcap_loop(pcap_handle, 5, callback, NULL);
	
	//关闭句柄
	pcap_close(pcap_handle);
	return 0;
}

 

知识点3【libnet发送原始套接字数据】

专业的构造和发送网络数据包的开发工具包

是个高层次的API函数库,允许开发者自己构造和发送网络数据包

头文件:include

编译的是加:-lnet

Libnet的安装

Libnet开发流程

利用libnet函数库开发应用程序的基本步骤:

1、数据包内存初始化

2、构造数据包

3、发送数据

4、释放资源

1、内存管理相关函数

libnet_t *libnet_init(int injection_type, char *device, char *err_buf)
功能:
    数据包内存初始化及环境建立
参数:
    injection_type: 构造的类型
    (LIBNET_LINK,LIBNET_RAW4,LIBNET_LINK_ADV(推荐),LIBNET_RAW4_ADV)
    device:网络接口,如"eth0",或IP地址,亦可为NULL(自动查询搜索)
    err_buf: 存放出错的信息
返回值:
成功返回一个libnet句柄;失败返回NULL
injection_type:构造的类型(LIBNET_LINK,LIBNET_RAW4,LIBNET_LINK_ADV,LIBNET_RAW4_ADV)

 

 2、释放资源

void libnet_destroy(libnet_t *l);
功能:
    释放资源
参数:
  l: libnet句柄
返回值:

3、构建udp报文 

libnet_ptag_t libnet_build_udp(
u_int16_t sp,u_int16_t dp,u_int16_t len,u_int16_t sum,
u_int8_t *payload,u_int32_t payload_s,
libnet_t *l,libnet_ptag_t ptag)
功能:
    构造udp数据包
返回值:
    成功返回协议标记;失败返回-1
参数:
    sp: 源端口号
    dp:目的端口号
    len:udp包总长度
    sum:校验和,设为0,libnet自动填充
    payload:负载,可设置为NULL
    payload_s:负载长度,或为0
    l: libnet句柄
    ptag:协议标记(其值为0创建一个新的协议数据,不为0,修改由ptag表示的协议数据)

 4、构造一个IPv4数据包

libnet_ptag_t libnet_build_ipv4(
u_int16_t ip_len,u_int8_t tos,
u_int16_t id,u_int16_t flag,
u_int8_t ttl,u_int8_t prot,
u_int16 sum,u_int32_t src,
u_int32_t dst,u_int8_t *payload,
u_int32_t payload_s,
libnet_t *l,libnet_ptag_t ptag)
功能:
    构造一个IPv4数据包
参数:
    ip_len:ip包总长
    tos:服务类型
    id:ip标识
    flag:片偏移
    ttl:生存时间
    prot:上层协议
    sum:校验和,设为0,libnet自动填充
    src: 源ip地址
    dst:目的ip地址
    payload:负载,可设置为NULL
    payload_s:负载长度,或为0
    l: libnet句柄
    ptag:协议标记
 
返回值:
    成功返回协议标记;失败返回-1

5、构造一个以太网数据包

libnet_ptag_t libnet_build_ethernet(
    u_int8_t *dst,u_int8_t *src,
    u_int16_t type,
    u_int8_t *payload,
    u_int32_t payload_s,
    libnet_t *l,libnet_ptag_t ptag)
功能:
    构造一个以太网数据包
 
参数:
    dst:目的mac
    src:源mac
    type:上层协议类型
    payload:负载,即附带的数据
    payload_s:负载长度
    l:libnet句柄
    ptag:协议标记
 
返回值:
    成功返回协议标记;失败返回-1

6、发送数据到网络

int libnet_write(libnet_t * l)
功能:
    发送数据到网络
参数:
  l:libnet句柄
返回值:
    失败返回-1,成功返回其他

综合案例:发送udp数据

#include<stdio.h>
#include <libnet.h>
#include<string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{	
	//1、初始化内存
	libnet_t *lib_handle = libnet_init(LIBNET_LINK_ADV,"eth0",NULL);
	
	char data[128]="";
	printf("请输入要发送的udp数据:");
	fgets(data,sizeof(data),stdin);
	data[strlen(data)-1]=0;
	int data_len = strlen(data)+strlen(data)%2;//长度为偶数
	
	//构建数据包:从应用层--->链路层
	//1、构建udp数据
	libnet_ptag_t ptag_udp = libnet_build_udp(8000,9000,8+data_len,\
	0,data,data_len, lib_handle, 0);
	
	//2、构建IP报文
	libnet_ptag_t ptag_ip = libnet_build_ipv4(20+8+data_len,0,0,0,128,\
	17,0,inet_addr("192.168.0.111"),inet_addr("192.168.0.110"),\
	NULL,0, lib_handle, 0);
	
	//3、构建mac数据报文
	unsigned char src_mac[6]={0x00,0x0c,0x29,0x79,0xf9,0x7f};
	unsigned char dst_mac[6]={0x70,0x5A,0x0F,0x63,0xF5,0x9D};
	libnet_ptag_t ptag_mac = libnet_build_ethernet(dst_mac, src_mac, 0x0800,\
	NULL,0, lib_handle, 0);
	
	//4、发送帧数据
	libnet_write(lib_handle);
	
	//循环的发送5次
	int i=0;
	for(i=0;i<5;i++)
	{
		printf("请输入要发送的udp数据:");
		fgets(data,sizeof(data),stdin);
		data[strlen(data)-1]=0;
		data_len = strlen(data)+strlen(data)%2;//长度为偶数
		
		//重新构建udp报文
		ptag_udp = libnet_build_udp(8000,9000,8+data_len,\
	0,data,data_len, lib_handle, ptag_udp);
		
		//重新构建IP报文
		ptag_ip = libnet_build_ipv4(20+8+data_len,0,0,0,128,\
	17,0,inet_addr("192.168.0.111"),inet_addr("192.168.0.110"),\
	NULL,0, lib_handle, ptag_ip);
		//发送帧数据
		libnet_write(lib_handle);
	}
	
	//释放资源
	libnet_destroy(lib_handle);
	return 0;
}

知识点4【BS开发概述】浏览器和服务器开发

HTML:超文本标记语言 静态的 显示网页

CSS:层叠样式表 渲染网页

XML:指可扩展标记语言 传输网页

Javascript:脚本语言 和 网页交互 (局部刷新网页)

AJAX:基于Javascript语言的技术 (将网页 和 服务器 交互)

CGI:通用网关接口(服务器 借助 CGI 控制 外设(数据库、传感器设备、文件))

2、B/S架构就是浏览器和服务器架构

Browser/Server(浏览器/服务器结构),是随着Internet技术的兴起,是对C/S结构的一种变化或者改进的结构。

用户界面完全通过www浏览器实现,一部分事物逻辑在前端实现,但是主要事务逻辑在服务器端实现。

B/S架构 与 C/S架构对比

角度

C/S

B/S

硬件环境

专用网络

广域网

安全要求

面向相对固定的用户群

信息安全的控制能力很强

面向是不可知的用户群

对安全的控制能力相对弱

程序架构

更加注重流程

系统运行速度可较少考虑

对安全以及访问速度要多重的考虑

B/S结构的程序架构是发展的趋势

软件重用

系统维护

升级难

开销小、方便升级

处理问题

集中

分散

用户接口

与操作系统关系密切

跨平台,与浏览器相关

信息流

交互性低

交互密集

知识点5【ubuntu下的boa服务器搭建】

boa-0.94.13-src.tar.gz

1、将boa-0.94.13-src.tar.gz拷贝到ubuntu中 并解压到当前目录

在ubuntu中解压:tar -xvf boa-0.94.13-src.tar.gz

解压成功会生成:boa-0.94.13-src文件夹

cd boa-0.94.13-src

 ls查看当前文件夹的内容 如下:

进入src目录

cd src

 ls查看目录内容:

 2、将来的boa服务器的目录结构分析

创建boa目录:

mkdir ~/share/boa/boa -p

创建log目录

mkdir ~/share/boa/log

创建www以及cgi-bin目录

mkdir ~/share/boa/www/cgi-bin -p

3、将boa.conf服务器的配置文件以及mime.types 拷贝 到/home/edu/share/boa/boa目录中

boa.conf在boa-0.94.13-src目录下:

将boa.conf拷贝到/home/edu/share/boa/boa下

cp boa.conf /home/edu/share/boa/boa

将/etc/mime.types拷贝/home/edu/share/boa/boa下

sudo cp /etc/mime.types /home/edu/share/boa/boa/

4、配置boa服务器在启动的时候 去/home/edu/share/boa/boa下查找配置文件boa.conf

注意上述路径配置在boa-0.94.13-src/src/defines.h中

编辑defines.h文件 

5、编译boa服务器的源码

1、./configure 生成Makefile

2、make编译源码

make

如果第一次make出现:make: bison:命令未找到。

解决方法:sudo apt-get install bison

如果第二次make出现:make: flex:命令未找到。

解决方法:sudo apt-get install flex

第三次make:就成功 就会在当前目录下 看到服务器boa可执行文件

3、将当前路径下服务器boa拷贝到 /home/edu/share/boa/boa下:

cp boa /home/edu/share/boa/boa/

6、在log目录下添加error_log access_log两个文件

touch /home/edu/share/boa/log/error_log

touch /home/edu/share/boa/log/access_log

成功如下图

7、在www目录下创建一个index.html网页

通过samba打开路径

 编辑网页:代码如下

<html>
	<head>
		<title>NZ2001</title>
	</head>
	<body>
		NZ2001 good good good!!!!
	</body>
</html

8、修改/home/edu/share/boa/boa/boa.conf

cd /home/edu/share/boa/boa/

 

 用notepad++打开:

 1、在48、49行将nobody、nogroup改成0

 2、在62行将ErrorLog /root/arm-boa/log/error_log改成ErrorLog /home/edu/share/boa/log/error_log

 3、在74行将AccessLog /root/arm-boa/log/access_log改成AccessLog /home/edu/share/boa/log/access_log

 4、在111行将DocumentRoot /root/arm-boa/www改成DocumentRoot /home/edu/share/boa/www

 5、在123行将DirectoryIndex homepage.html改成DirectoryIndex index.html

6、在155行将MimeTypes /etc/mime.types改成MimeTypes /home/edu/share/boa/boa/mime.types 

 7、在193行将ScriptAlias /cgi-bin/ /root/arm-boa/www/cgi-bin/改成ScriptAlias /cgi-bin/ /home/edu/share/boa/www/cgi-bin/

9、启动boa服务器 

cd /home/edu/share/boa/boa

sudo ./boa

ps -A | grep boa 说明boa运行成功

10、测试服务器是否好使

打开windows打开浏览器输入ubuntu的ip

 

 

 

 

 

 

 

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

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

相关文章

(经典dp) hdu 递推求解专题练习

文章目录前言题单hdu2044 一只小蜜蜂...hdu2045 不容易系列之(3)—— LELE的RPG难题hdu2046 骨牌铺方格hdu2047 阿牛的EOF牛肉串hdu2048 神、上帝以及老天爷hdu2049 不容易系列之(4)——考新郎hdu2050 折线分割平面END前言 题单&#xff1a;递推求解专题练习&#xff08;For Be…

华为机试 - 找出经过特定点的路径长度

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 无 输入描述 输入一个字符串&#xff0c;都是以大写字母组成&#xff0c;每个相邻的距离是 1&#xff0c; 第二行输入一个字符串&#xff0c;表示必过的点。 说明每个点可过多次。 输出描述 经过这…

精益(Lean)与ERP实施

周四、五看完了24小时不停的Lean Global Connection&#xff0c;总觉得要说些什么。 印象最深的有三个地方&#xff1a; 一是John Shook的话&#xff0c;他说Lean是一种Mindset。 这种Mindset是&#xff1a; 一种积极的态度&#xff0c;Problems solving, 把问题和挑战当成是…

Web 性能优化:TLS

个人博客 Web 性能优化&#xff1a;TCP&#x1f3af; Web 性能优化&#xff1a;TLSWeb 性能优化&#xff1a;HTTP “do it, do it work, do it better … and secure ☠️” 随着追逐利益而来的恶意参与者越来越多&#xff0c;当前的 Web 应用&#xff0c;已经从野蛮生长转而…

【通关MySQL】Java的JDBC编程

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【通关MySQL】 ✈️✈️本篇内容:Java的JDBC编程。 &#x1f680;&#x1f680;代码存放仓库gitee&#xff1a;MySQL码云存放&#xff01; ⛵⛵作者简介&#xff…

[附源码]java毕业设计-室内田径馆预约管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

轻量应用服务器和云服务器CVM有什么区别?

腾讯云新推出的轻量应用服务器Lighthouse和原来的CVM云服务器有什么区别&#xff1f;轻量应用服务器Lighthouse是一种易于使用和管理、适合承载轻量级业务负载的云服务器&#xff0c;主要用于Web网站应用&#xff0c;轻量服务器使用及后期运维更加简单方便&#xff1b;云服务器…

RNA-seq 保姆教程:差异表达分析(二)

介绍 RNA-seq 目前是测量细胞反应的最突出的方法之一。RNA-seq 不仅能够分析样本之间基因表达的差异&#xff0c;还可以发现新的亚型并分析 SNP 变异。本教程[1]将涵盖处理和分析差异基因表达数据的基本工作流程&#xff0c;旨在提供设置环境和运行比对工具的通用方法。由于完整…

计算机网络——数据链路层

数据链路层概述 数据链路层在网络体系结构中所处的地位 主机H1给主机H2发送数据时&#xff0c;需要通过路由器R1通过广域网链路转发到路由器R2&#xff0c;R2转发到主机H2。路由器转发只用到网络层及以下各层。【以上涉及数据包按网络体系结果逐层封装解封】 为了简单起见&am…

DevC++的调试方法

目录 Dev C调试程序 Dev C调试注意事项对于修改后的程序&#xff0c;调试程序之前一定要先编译程序。 要想学会编程,第一步就是要学会调试(想我这种码龄一年的人还不会调试,丢死人). 今天,为了让你们的脸丢少点,特意写了这篇博文,给予需要帮助的人. 所谓调试程序&#xff0…

[附源码]计算机毕业设计JAVA基于JSP健身房管理系统

[附源码]计算机毕业设计JAVA基于JSP健身房管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM m…

Python实现KNN(K近邻)分类模型(KNeighborsClassifier算法)并应用网格搜索算法寻找最优参数值以及数据标准化均衡化项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 股票市场是已经发行的股票转让、买卖和流通的场所&#xff0c;包括交易所市场和场外交易市场两大类别。…

【C++】C++11部分特性

目录 一、初始化列表 二、变量类型的推导 1、auto 2、decltype 三、右值引用 1、左值与右值 2、关于左值引用、右值引用的问题 1、左值引用可以引用右值吗&#xff1f; 2、右值引用可以引用左值吗&#xff1f; 3、右值引用之后的问题 3、移动构造、移动拷贝 1、引用…

软件测试质量保证与测试

软件测试质量保证与测试 第一章 软件测试概述 1.1 软件测试背景 随着计算机技术的迅速发展和越来越广泛深入地应用于国民经济与社会生活的各个方面&#xff0c;软件系统的规模和复杂性与日俱增&#xff0c;软件的生产成本和软件中存在的缺陷与故障造成的各类损失也大大增加&…

【应用】PostgreSQL 流复制配置

PostgreSQL 流复制配置centos7 安装 postgresql时序库 timescaleDB 的安装postgresql-14 主从流复制主库配置从库配置同步流复制与异步流复制异步流复制转换为同步流复制流复制的相关参数主从流复制原理PostgreSQL WAL 日志主从流复制架构主从流复制的过程基于 docker swarm 的…

CMSC5713-IT项目管理之七、质量管理Quality Management

文章目录7.1 Quality7.2. Software Quality7.2.1. ISO/IEC 25010 Software Qualities7.2.2. Internal versus External qualities7.2.3. Software Metrics7.3. Quality Specification7.4. Project Quality Management7.4.1. Quality Planning7.4.2. Quality Assurance7.4.2.1. …

vscode 阅读 linux kernel 源码

前言 虽然身边的朋友大都在使用 source insight&#xff0c;但我却更喜欢 vscode。 不过 vscode 在代码搜索上确实不如 source insight&#xff0c;这点上我也是吃过亏的。阅读大型代码时&#xff0c;常常搜索不到关键代码&#xff0c;导致对代码的理解不充分。 当使用 vscode…

Java-反射

前言 动态语言与静态语言 动态语言 是一类在运行时可以改变其结构的语言&#xff1a;例如新的函数、对象、甚至代码可以被引进&#xff0c;已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构主要动态语言有&#xff1a;Object…

【开源电路】STM32F401RCT6开发板

【开源电路】STM32F401RCT6开发板&#x1f337;实物PCBA&#xff1a; &#x1f33c;优化后的3D效果图 &#x1f4da;STM32F401RCT6开发板简介 &#x1f4d1;主控是LQFP-64封装的STM32F401RCT6芯片&#xff0c;Micro USB接口供电&#xff0c;功能引脚全部引出&#xff0c;一个…

金融强化学习与finRL开发包

原创文章第110篇&#xff0c;专注“个人成长与财富自由、世界运作的逻辑&#xff0c; AI量化投资”。 01 一些感受 时代的一粒沙&#xff0c;落在每个人身上就是一座山。 这三年&#xff0c;对于这句话&#xff0c;相信很多人更能感同身受。 看历史风云变幻&#xff0c;轻轻…