VS2022配置WinPcap开发

winpcap 官网:http://www.winpcap.org/
1.首先下载安装 winpcap.exe,http://www.winpcap.org/install/default.htm
目的是安装相关驱动和 dll,安装完成之后基于 winpcap 的应用程序才能够正常运行。
2.下载 winpcap 的开发包,头文件和库文件:http://www.winpcap.org/devel.htm,解压之后主要是头文件和库文件,记得将 WpdPack 复制到 D 盘(直接放在D盘,不要包含在其他文件夹下),如图所示:

VS2022新建一个C++工程,具体操作可参考我上一篇文章,文章链接如下:http://t.csdnimg.cn/RRO57

创建工程后,首先在 vs 中配置(vc++目录:include 目录和 lib 目录),具体步骤如下:

点击“项目”,再点击最下方的属性:

点击VC++目录,如图所示:

接下来修改“包含目录”和“库目录”,包含目录修改为:D:\WpdPack\Include;$(IncludePath)

库目录修改为:D:\WpdPack\Lib\x64;$(LibraryPath),如图所示:

接着,link 输入:wpcap.lib,ws2_32.lib,具体步骤如下:

在左边的配置属性找到“链接器”,点击,接着点击“输入”:

然后在“附加依赖项”处,添加wpcap.lib和ws2_32.lib两个库,如图所示:(前面的用这两个替换掉,后面的不要动)

接着点击配置预处理器定义,具体步骤如下:

在配置属性处点击C/C++,接着点击“预处理器”,如图所示:

在“预处理器定义”处修改为“WPCAP;HAVE_REMOTE;WIN32;_CRT_SECURE_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS”,如图所示:

接着点击“应用”,再点击“确定”,如图:

代码如下:

//#define HAVE_REMOTE
//#define WPCAP
#include "pcap.h" 
#include <winsock2.h>
#include <string.h>
#include <stdio.h>
using namespace std;
#pragma comment(lib, "wpcap.lib")
#pragma comment(lib, "Ws2_32.lib")
#define LINE_LEN 16
#define MAX_ADDR_LEN 16
FILE* file = 0;
int ip_len;
int tcp_len;
// 以太网协议格式的定义
typedef struct ether_header {u_char ether_dhost[6]; // 目标 MAC 地址u_char ether_shost[6]; // 源 MAC 地址u_short ether_type; // 以太网类型
}ether_header;
// 用户保存 4 字节的 IP 地址
typedef struct ip_address {u_char byte1;u_char byte2;u_char byte3;u_char byte4;
}ip_address;
// 用于保存 IPV4 的首部
typedef struct ip_header {u_char version_hlen; // 首部长度 版本u_char tos; // 服务质量u_short tlen; // 总长度u_short identification; // 身份识别u_short flags_offset; // 标识 分组偏移u_char ttl; // 生命周期u_char proto; // 协议类型u_short checksum; // 包头测验码u_int saddr; // 源 IP 地址u_int daddr; // 目的 IP 地址
}ip_header;
// 用于保存 TCP 首部
typedef struct tcp_header {u_short sport;u_short dport;u_int sequence; // 序列码u_int ack; // 回复码u_char hdrLen; // 首部长度保留字u_char flags; // 标志u_short windows; // 窗口大小u_short checksum; // 校验和u_short urgent_pointer; // 紧急指针
}tcp_header;
// 用于保存 UDP 的首部
typedef struct udp_header {u_short sport; // 源端口u_short dport; // 目标端口u_short datalen; // UDP 数据长度u_short checksum; // 校验和
}udp_header;
// 用于保存 ICMP 的首部
typedef struct icmp_header {u_char type; // ICMP 类型u_char code; // 代码u_short checksum; // 校验和u_short identification; // 标识u_short sequence; // 序列号u_long timestamp; // 时间戳
}icmp_header;
// 用于保存 ARP 的首部
typedef struct arp_header {u_short hardware_type; // 格式化的硬件地址u_short protocol_type; // 协议地址格式u_char hardware_length; // 硬件地址长度u_char protocol_length; // 协议地址长度u_short operation_code; // 操作码u_char source_ethernet_address[6]; // 发送者硬件地址u_char source_ip_address[4]; // 发送者协议地址u_char destination_ethernet_address[6]; // 目的方硬件地址u_char destination_ip_address[4]; // 目的方协议地址
}arp_header;
#define str4cmp(m, c0, c1, c2, c3) \
(m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3)
void http_protocol_packet_handle(u_char* arg, const struct pcap_pkthdr* pkt_header, constu_char* pkt_content)
{FILE* file1 = 0;//下面这个打开文件能写在这里吗?在这里打开有什么问题?写在这里合适吗?如何改进一下?if ((file1 = freopen("http.txt", "a", stdout)) == 0)printf("Cannot open the file.\n");//加上前面的 IP 头以及以太网还有 TCP 头才是 HTTP 数据包头部const u_char* http_head = (u_char*)pkt_content + (14 + ip_len + tcp_len);if (http_head != NULL) {//报文有内容:if (str4cmp(http_head, 'G', 'E', 'T', ' ')) {//判断是否为 GET 请求printf("\n===================HTTP Protocol=================\n");u_char* uri_start = (u_char*)http_head + 4;u_char* p = uri_start;printf("当前 HTTP 请求 uri 是:");while (true){if (str4cmp(p, 'H', 'T', 'T', 'P')) //说明相对 url 读取完毕break;printf("%c", p[0]);p = p + 1;}printf("\nhost:");while (true){if (str4cmp(p, 'H', 'o', 's', 't')){p = p + 5;//跳过 HOST:while (true){printf("%c", p[0]);if (p[1] == '\n') //如果下一个是换行符,就说明这一行读取结束,host 读取完毕break;p = p + 1;}break;}p = p + 1;}}}fclose(stdin);fclose(file1);
}
// TCP 协议处理
//u_short sport;
//u_short dport;
//u_int sequence; // 序列码
//u_int ack; // 回复码
//u_char hdrLen; // 首部长度保留字
//u_char flags; // 标志
//u_short windows; // 窗口大小
//u_short checksum; // 校验和
//u_short urgent_pointer; // 紧急指针
// ntohs()是一个函数名,作用是将一个 16 位数由网络字节顺序转换为主机字节顺序
void tcp_protocol_packet_handle(u_char* arg, const struct pcap_pkthdr* pkt_header, constu_char* pkt_content)
{tcp_header* tcp_protocol;tcp_protocol = (tcp_header*)(pkt_content + 14 + 20);//cout << sizeof(u_int) << endl;printf("===================TCP Protocol=================\n");printf("Source Port: %i\n", ntohs(tcp_protocol->sport));printf("Destination Port: %i\n", ntohs(tcp_protocol->dport));//8002printf("Sequence number: %d\n", ntohl(tcp_protocol->sequence));printf("Acknowledgment number: %d\n", ntohl(tcp_protocol->ack));printf("Header Length: %d\n", (tcp_protocol->hdrLen >> 4) * 4);printf("Flags: 0x%.3x ", tcp_protocol->flags);tcp_len = (tcp_protocol->hdrLen >> 4) * 4;if (tcp_protocol->flags & 0x08) printf("(PSH)");if (tcp_protocol->flags & 0x10) printf("(ACK)");if (tcp_protocol->flags & 0x02) printf("(SYN)");if (tcp_protocol->flags & 0x20) printf("(URG)");if (tcp_protocol->flags & 0x01) printf("(FIN)");if (tcp_protocol->flags & 0x04) printf("(RST)");if (ntohs(tcp_protocol->dport) == 80){//获取 HTTP 数据包的 header 地址 传入 HTTP 解析函数http_protocol_packet_handle(arg, pkt_header, pkt_content);}printf("\n");printf("Windows Size: %i\n", ntohs(tcp_protocol->windows));printf("Checksum: 0x%.4x\n", ntohs(tcp_protocol->checksum));printf("Urgent Pointer: %i\n", ntohs(tcp_protocol->urgent_pointer));
}
// UDP 协议处理
//u_short sport; // 源端口
//u_short dport; // 目标端口
//u_short datalen; // UDP 数据长度
//u_short checksum; // 校验和
void udp_protocol_packet_handle(u_char* arg, const struct pcap_pkthdr* pkt_header, constu_char* pkt_content)
{udp_header* udp_protocol;udp_protocol = (udp_header*)(pkt_content + 14 + 20);printf("===================UDP Protocol=================\n");printf("Source Port: %i\n", ntohs(udp_protocol->sport));printf("Destination Port: %i\n", ntohs(udp_protocol->dport));printf("Datalen: %i\n", ntohs(udp_protocol->datalen));printf("Checksum: 0x%.4x\n", ntohs(udp_protocol->checksum));
}
// ICMP 协议处理
//u_char type; // ICMP 类型
//u_char code; // 代码
//u_short checksum; // 校验和
//u_short identification; // 标识
//u_short sequence; // 序列号
//u_long timestamp; // 时间戳
void icmp_protocol_packet_handle(u_char* arg, const struct pcap_pkthdr* pkt_header, constu_char* pkt_content)
{icmp_header* icmp_protocol;icmp_protocol = (icmp_header*)(pkt_content + 14 + 20);printf("==================ICMP Protocol=================\n");printf("Type: %d ", icmp_protocol->type);switch (icmp_protocol->type){case 8:printf("(request)\n");break;case 0:printf("(reply)\n");break;default:printf("\n");break;}printf("Code: %d\n", icmp_protocol->code);printf("CheckSum: 0x%.4x\n", ntohs(icmp_protocol->checksum));printf("Identification: 0x%.4x\n", ntohs(icmp_protocol->identification));printf("Sequence: 0x%.4x\n", ntohs(icmp_protocol->sequence));
}
// ARP 协议处理
//u_short hardware_type; // 格式化的硬件地址
//u_short protocol_type; // 协议地址格式
//u_char hardware_length; // 硬件地址长度
//u_char protocol_length; // 协议地址长度
//u_short operation_code; // 操作码
//u_char source_ethernet_address[6]; // 发送者硬件地址
//u_char source_ip_address[4]; // 发送者协议地址
//u_char destination_ethernet_address[6]; // 目的方硬件地址
//u_char destination_ip_address[4]; // 目的方协议地址
void arp_protocol_packet_handle(u_char* arg, const struct pcap_pkthdr* pkt_header, constu_char* pkt_content)
{arp_header* arp_protocol;arp_protocol = (arp_header*)(pkt_content + 14);printf("==================ARP Protocol==================\n");printf("Hardware Type: ");switch (ntohs(arp_protocol->hardware_type)){case 1:printf("Ethernet");break;default:break;}printf(" (%d)\n", ntohs(arp_protocol->hardware_type));printf("Protocol Type: \n");switch (ntohs(arp_protocol->protocol_type)){case 0x0800:printf("%s", "IP");break;case 0x0806:printf("%s", "ARP");break;case 0x0835:printf("%s", "RARP");break;default:printf("%s", "Unknown Protocol");break;}printf(" (0x%04x)\n", ntohs(arp_protocol->protocol_type));printf("Hardware Length: %d\n", arp_protocol->hardware_length);printf("Protocol Length: %d\n", arp_protocol->protocol_length);printf("Operation Code: ");switch (ntohs(arp_protocol->operation_code)){case 1:printf("request");break;case 2:printf("reply");break;default:break;}printf(" (%i)\n", ntohs(arp_protocol->operation_code));
}
// IP 协议处理
//u_char version_hlen; // 首部长度 版本
//u_char tos; // 服务质量
//u_short tlen; // 总长度
//u_short identification; // 身份识别
//u_short flags_offset; // 标识 分组偏移
//u_char ttl; // 生命周期
//u_char proto; // 协议类型
//u_short checksum; // 包头测验码
//u_int saddr; // 源 IP 地址
//u_int daddr; // 目的 IP 地址
void ip_protocol_packet_handle(u_char* arg, const struct pcap_pkthdr* pkt_header, constu_char* pkt_content)
{ip_header* ip_protocol;sockaddr_in source, dest;char sourceIP[MAX_ADDR_LEN], destIP[MAX_ADDR_LEN];ip_protocol = (ip_header*)(pkt_content + 14);source.sin_addr.s_addr = ip_protocol->saddr;dest.sin_addr.s_addr = ip_protocol->daddr;strncpy(sourceIP, inet_ntoa(source.sin_addr), MAX_ADDR_LEN);strncpy(destIP, inet_ntoa(dest.sin_addr), MAX_ADDR_LEN);printf("===================IP Protocol==================\n");printf("Version: %d\n", ip_protocol->version_hlen >> 4);printf("Header Length: %d bytes\n", (ip_protocol->version_hlen & 0x0f) * 4);ip_len = (ip_protocol->version_hlen & 0x0f) * 4;printf("Tos: %d\n", ip_protocol->tos);printf("Total Length: %d\n", ntohs(ip_protocol->tlen));printf("Identification: 0x%.4x (%i)\n", ntohs(ip_protocol->identification), ntohs(ip_protocol->identification));printf("Flags: %d\n", ntohs(ip_protocol->flags_offset) >> 13);printf("---Reserved bit: %d\n", (ntohs(ip_protocol->flags_offset) & 0x8000) >> 15);printf("---Don't fragment: %d\n", (ntohs(ip_protocol->flags_offset) & 0x4000) >> 14);printf("---More fragment: %d\n", (ntohs(ip_protocol->flags_offset) & 0x2000) >> 13);printf("Fragment offset: %d\n", ntohs(ip_protocol->flags_offset) & 0x1fff);printf("Time to live: %d\n", ip_protocol->ttl);printf("Protocol Type: ");switch (ip_protocol->proto){case 1:printf("ICMP");break;case 6:printf("TCP");break;case 17:printf("UDP");break;default:break;}printf(" (%d)\n", ip_protocol->proto);printf("Header checkSum: 0x%.4x\n", ntohs(ip_protocol->checksum));printf("Source: %s\n", sourceIP);printf("Destination: %s\n", destIP);if (ip_protocol->proto == htons(0x0600))tcp_protocol_packet_handle(arg, pkt_header, pkt_content);else if (ip_protocol->proto == htons(0x1100))udp_protocol_packet_handle(arg, pkt_header, pkt_content);else if (ip_protocol->proto == htons(0x0100))icmp_protocol_packet_handle(arg, pkt_header, pkt_content);
}
// Ethernet 协议处理
void ethernet_protocol_packet_handle(u_char* arg, const struct pcap_pkthdr* pkt_header, const u_char* pkt_content)
{ether_header* ethernet_protocol;//以太网协议u_short ethernet_type; //以太网类型u_char* mac_string; //以太网地址//获取以太网数据内容ethernet_protocol = (ether_header*)pkt_content;ethernet_type = ntohs(ethernet_protocol->ether_type);printf("==============Ethernet Protocol=================\n");//以太网目标地址mac_string = ethernet_protocol->ether_dhost;printf("Destination Mac Address: %02x:%02x:%02x:%02x:%02x:%02x\n", *mac_string,*(mac_string + 1), *(mac_string + 2), *(mac_string + 3), *(mac_string + 4), *(mac_string + 5));//以太网源地址mac_string = ethernet_protocol->ether_shost;printf("Source Mac Address: %02x:%02x:%02x:%02x:%02x:%02x\n", *mac_string, *(mac_string + 1), *(mac_string + 2), *(mac_string + 3), *(mac_string + 4), *(mac_string + 5));printf("Ethernet type: ");switch (ethernet_type){case 0x0800:printf("%s", "IP");break;case 0x0806:printf("%s", "ARP");break;case 0x0835:printf("%s", "RARP");break;default:printf("%s", "Unknown Protocol");break;}printf(" (0x%04x)\n", ethernet_type);switch (ethernet_type){case 0x0800:ip_protocol_packet_handle(arg, pkt_header, pkt_content);break;case 0x0806:arp_protocol_packet_handle(arg, pkt_header, pkt_content);break;case 0x0835:printf("==============RARP Protocol=================\n");printf("RARP\n");break;default:printf("==============Unknown Protocol==============\n");printf("Unknown Protocol\n");break;}
}
int main()
{pcap_if_t* alldevs; //适配器列表,它是一个链表的数据结构pcap_if_t* d; //保存某个适配器pcap_t* fp;int res;struct pcap_pkthdr* header;const u_char* pkt_data;time_t local_tv_sec;struct tm* ltime;char timestr[16];int count = 1;int i = 0, inum;char errbuf[PCAP_ERRBUF_SIZE];printf("===============Adapter List===============\n");//获取本地设备列表if (pcap_findalldevs(&alldevs, errbuf) == -1){fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);exit(1);}//htons()作用是将端口号由主机字节序转换为网络字节序的整数值。(host to net)//inet_addr()作用是将一个 IP 字符串转化为一个网络字节序的整数值,用于sockaddr_in.sin_addr.s_addr。//inet_ntoa()作用是将一个 sin_addr 结构体输出成 IP 字符串(network to ascii)。//输出列表for (d = alldevs; d != NULL; d = d->next){//printf("%d. %s,addr:%s", ++i, d->name, d->addresses->addr->sa_data);printf("%d. %s,", ++i, d->name);if (d->description)printf(" (%s)\n", d->description);elseprintf(" (No description available)\n");}if (i == 0){printf("\nNo interfaces found! Make sure WinPcap is installed.\n");return -1;}//获取选择编号while (1){printf("\nEnter the interface number (1-%d): ", i);scanf("%d",&inum);if (inum > 0 && inum <= i)break;}//跳到用户选择的适配器for (d = alldevs, i = 0; i < inum - 1; ++i, d = d->next);//打开适配器if ((fp = pcap_open_live(d->name,65536,1,1000,errbuf)) == NULL){fprintf(stderr, "\nError openning adapter: %s\n", errbuf);pcap_freealldevs(alldevs);return -1;}//检查链路层的类型if (pcap_datalink(fp) != DLT_EN10MB){fprintf(stderr, "This program only run on Ethernet networks\n");pcap_close(fp);pcap_freealldevs(alldevs);return -1;}printf("The program is working......\n");printf("The capture file is saving as 'data.txt'\n");printf("You can input 'ctrl + C' to stop the program\n");if ((file = freopen("data.txt", "w", stdout)) == 0)printf("Cannot open the file.\n");while ((res = pcap_next_ex(fp, &header, &pkt_data)) >= 0){//超时if (res == 0)continue;//将时间戳转化为可识别格式local_tv_sec = header->ts.tv_sec;ltime = localtime(&local_tv_sec);strftime(timestr, sizeof(timestr), "%H:%M:%S", ltime);//输出编号、时间戳和包长度printf("============================================================================= = \n");printf("No.%d\ttime: %s\tlen: %ld\n", count++, timestr, header->len);printf("============================================================================= = \n");char temp[LINE_LEN + 1];//输出包for (i = 0; i < header->caplen; ++i){printf("%.2x ", pkt_data[i]);if (isgraph(pkt_data[i]) || pkt_data[i] == ' ')temp[i % LINE_LEN] = pkt_data[i];elsetemp[i % LINE_LEN] = '.';if (i % LINE_LEN == 15){temp[16] = '\0';printf(" ");printf("%s", temp);printf("\n");memset(temp, 0, LINE_LEN);}}printf("\n");//分析数据包ethernet_protocol_packet_handle(NULL, header, pkt_data);}if (res == -1){printf("Error reading the packets: %s\n", pcap_geterr(fp));pcap_close(fp);pcap_freealldevs(alldevs);fclose(stdin);if (file)fclose(file);return -1;}//释放pcap_close(fp);pcap_freealldevs(alldevs);fclose(stdin);if (file)fclose(file);return 0;
}

将代码粘贴到Main.cpp里,如图:

点击运行:

结果如图所示:

成功啦!

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

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

相关文章

FFmpeg之将视频转为16:9(横屏)或9:16(竖屏)(三十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

如何判断台灯是否伤眼?分享考研必备的护眼台灯

台灯可以说是我们日常生活中必不可少的一盏灯具&#xff0c;可以在夜晚的时候给我们带来充足的照明环境&#xff01;而且近年来儿童青少年的近视率都非常之高&#xff0c;不少家长们为了保护孩子视力选择专业的台灯&#xff0c;因为专业的台灯对眼睛是有许多好处的&#xff0c;…

记录华为云服务器(Linux 可视化 宝塔面板)-- Nginx配置出现500错误记录

文章目录 1、路由配置&#xff0c;访问显示500如有启发&#xff0c;可点赞收藏哟~ 1、路由配置&#xff0c;访问显示500 错误如图显示500 解决思路如下 1、先查看错误日志 错误日志存放位置 提示 /login配置的文件有问题 开始配置如下图 修改前 修改后&#xff08;即在/l…

echarts笔记-GeoJSON河北数据下并裁剪为冀北地图并使用echarts加载

首先找个网站把河北的GeoJSON数据下载下来&#xff0c;我用的是这个&#xff0c;理论上任意一个都可以 DataV.GeoAtlas地理小工具系列 将json数据下载后&#xff0c;进行裁剪&#xff0c;仅保留冀北数据。 如下&#xff0c;我裁剪的数据&#xff1a; {"type": &qu…

网工学习9-STP配置

如图 1 所示&#xff0c;当前网络中存在环路&#xff0c; SwitchA 、SwitchB 、SwitchC 和 SwitchD 都运行 STP&#xff0c;通过 彼此交互信息发现网络中的环路&#xff0c;并有选择的对某个端口进行阻塞&#xff0c;最终将环形网络结构修剪成无 环路的树形网络结构&#xff…

leetcode 201 数字范围按位与

leetcode 201 题目题解代码 题目 给你两个整数 left 和 right &#xff0c;表示区间 [left, right] &#xff0c;返回此区间内所有数字 按位与 的结果&#xff08;包含 left、right 端点&#xff09;。 具体示例如下&#xff1a; 题解 本题是一个在思维上的方法&#xff0c;不…

怎么理解回流和重绘?

回流&#xff08;reflow&#xff09;和 重绘&#xff08;repaint&#xff09;是浏览器渲染过程中的两个关键概念。 一、概念&#xff1a; 回流指的是浏览器在计算文档流布局&#xff08;layout&#xff09;时&#xff0c;重新计算元素的位置和大小的过程。当页面中的元素发生尺…

Leetcode—1038.从二叉搜索树到更大和树【中等】

2023每日刷题&#xff08;四十九&#xff09; Leetcode—1038.从二叉搜索树到更大和树 算法思想 二叉搜索树的中序遍历&#xff08;左根右&#xff09;结果是一个单调递增的有序序列&#xff0c;我们反序进行中序遍历&#xff08;右根左&#xff09;&#xff0c;即可以得到一…

网络层之SDN基本概念、路由算法和路由协议

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

自然语言处理:电脑如何理解我们的语言?

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 ​ 文章目录 ​编辑 常见方法 1.基于词典的方法 2.基于计数的方法 基于推理的方法 Bert input_ids attention_mask token_type_ids 结语 在广…

排序算法介绍(五)归并排序

0. 简介 归并排序&#xff08;Merge Sort&#xff09;是一种分治思想的应用&#xff0c;它将待排序的数组不断拆分成小数组&#xff0c;直到每个小数组只有一个元素&#xff0c;然后将小数组两两合并&#xff0c;直到最终得到有序的数组。 1. 归并排序的实现 归并排序的基本思…

【2021研电赛】基于EAIDK310的视觉导航自动驾驶小车

本作品介绍参与极术社区的有奖征集|分享研电赛作品扩大影响力&#xff0c;更有重磅电子产品免费领取! 团队价绍 参赛单位&#xff1a;上海应用技术大学 参赛队伍&#xff1a;EAIDK666 指导老师&#xff1a;蒋文萍 丁肇红 参赛队员&#xff1a;温晓静 孙亦劼 杜为栋 获奖情况&a…

JS防抖与节流

防抖 防抖是什么&#xff1f; 单位时间内&#xff0c;频繁触发事件&#xff0c;只执行最后一次 通俗易懂点就是把防抖想象成MOBA游戏的回城&#xff0c;在回城过程中被打断就要重来 例子&#xff1a;我们来做一个效果&#xff0c;我们鼠标在盒子上移动&#xff0c;数字就变化 …

Python爬虫:使用Scrapy框架进行高效爬取

Python爬虫可使用的架构有很多&#xff0c;对于我而言&#xff0c;经常使用Scrapy异步处理框架Twisted&#xff0c;其实意思很明确&#xff0c;Scrapy可以实现多并发处理任务&#xff0c;同一时间将可以处理多个请求并且大大提高工作效率。 Scrapy是一个强大且高效的Python爬虫…

鸿蒙Watch 页面跳转

新建页面 config.json 回自动注册 添加跳转 <button type"capsule" onclick"toStatusMonitor">状态检测</button>写跳转方法 import router from system.router;export default {data: {},onInit() {},onShow() {},toStatusMonitor() {rou…

深度学习——第3章 Python程序设计语言(3.2 Python程序流程控制)

无论是在机器学习还是深度学习中&#xff0c;Python已经成为主导性的编程语言。而且&#xff0c;现在许多主流的深度学习框架&#xff0c;例如PyTorch、TensorFlow也都是基于Python。本课程主要是围绕“理论实战”同时进行&#xff0c;所以本章将重点介绍深度学习中Python的必备…

pandas、numpy的几个示例

这里写自定义目录标题 Pandas 示例NumPy 示例数据分析案例: Iris 数据集 Pandas 示例 Pandas 是一个数据处理和分析的库&#xff0c;它提供了 DataFrame 和 Series 这两种主要数据结构。 # 从字典创建 DataFrame import pandas as pd# 创建一个字典 data {Name: [Alice, Bob…

C++学习之路(十七)C++ 用Qt5实现一个工具箱(增加托盘图标并且增加显示和退出菜单)- 示例代码拆分讲解

上篇文章&#xff0c;我们用 Qt5 实现了在小工具箱中添加了《为屏幕颜色提取功能增加一个点击复制的功能》功能。今天我们增加一个比较正式点的功能&#xff0c;就是增加托盘图标并且增加显示和退出菜单&#xff08;越来越像回事了吧 &#x1f601; &#xff09;。下面我们就来…

【CMD】关于在for中SET变量失效的问题

如题&#xff0c;在for中进行一些细化操作时发现SET变量一直不成功(尤其在读取文件时)   简单搜了下看到有个帖子(BAT求助与讨论-SET变量失效)是讨论这个问题的&#xff0c;然后有个老哥给出的解答&#xff0c;其中使用了使用CALL&#xff0c;这让我想起几天前看到的一个博客…

Linux4.7、环境变量

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 基本概念 见见环境变量 指令原理 常见环境变量及其测试 环境变量相关指令 环境变量组织方式 通过代码获取环境变量 通过系统变量获取环境变量以及设置环境变量 环境变量的全局属性 基本概念 首先&#xff0c;…