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

Linux C/C++ 嗅探数据包并显示流量统计信息

嗅探数据包并显示流量统计信息是网络分析中的一种重要技术,常用于网络故障诊断、网络安全监控等方面。具体来说,嗅探器是一种可以捕获网络上传输的数据包,并将其展示给分析人员的软件工具。在嗅探器中,使用pcap库是一种常见的方法,因为它提供了一种跨平台的接口,可以有效地访问操作系统的数据包捕获功能。

数据包捕获函数库(Libpcap)

Libpcap是一种独立于系统的用户层包捕获API接口,为底层网络监测提供了一个可移植的框架。它允许程序员使用简单的C语言编程接口,来捕获和分析网络数据包。要使用libpcap来嗅探数据包并显示流量统计信息,可以按照以下步骤进行:

  • 1.安装libpcap库:首先需要安装libpcap库,可以在大多数Linux发行版中使用包管理器进行安装,例如在Ubuntu中可以使用以下命令:sudo yum install libpcap-dev。
  • 2.创建数据包捕获程序:使用C语言编写程序,并引入libpcap库。在程序中,需要使用libpcap的函数来打开网络接口、捕获数据包、解码数据包等。
  • 3.数据包捕获:使用libpcap的pcap_open_live()函数打开网络接口(如eth0),并获取该接口的原始套接字(raw socket)。然后使用pcap_next()或pcap_next_ex()函数从原始套接字中读取数据包。
  • 4.数据包解码:对捕获到的数据包进行解码,提取协议字段和数据内容。
  • 5.流量统计和分析:对解码后的数据包进行流量统计和分析。例如,可以计算每个数据包的长度、接收到的数据包数量、每个协议的数据流量等。
  • 6.数据包过滤:使用BPF(Berkeley Packet Filter)算法对捕获到的数据包进行过滤。BPF算法的基本思想是在有BPF监听的网络中,网卡驱动将接收到的数据包复制一份交给BPF过滤器,过滤器根据用户定义的规则决定是否接收此数据包以及需要拷贝该数据包的那些内容,然后将过滤后的数据给与过滤器相关联的上层应用程序。
  • 7.数据展示:将分析结果以图形化或文本形式展示给用户。

实现上述功能的需要准备的知识点包括:C语言编程、网络协议知识、libpcap库的使用、BPF算法原理等。同时,需要对底层网络监测技术有一定的了解,以便更好地理解和实现嗅探器程序的功能。

怎样使用Wireshark/tcpdump进行数据包嗅探

嗅探数据包并显示统计信息,可以使用Wireshark这个网络协议分析工具。以下是使用Wireshark进行数据包嗅探的步骤:

  • 1.下载并安装Wireshark:访问Wireshark官网(https://www.wireshark.org/)下载适合你操作系统的版本,然后按照提示进行安装。
  • 2.打开Wireshark:在开始菜单或应用程序列表中找到Wireshark,双击打开。
  • 3.选择网络接口:在Wireshark主界面的顶部,点击“捕获”选项卡,然后选择你想要嗅探的网络接口。如果你不确定应该选择哪个接口,可以查看网络连接详细信息,找到正确的接口名称。
  • 4.开始嗅探:点击“捕获选项”按钮,设置捕获过滤器(可选),然后点击“开始”按钮开始嗅探数据包。
  • 5.停止嗅探:当你完成数据包嗅探后,点击“停止”按钮停止捕获。
  • 6.显示统计信息:在Wireshark主界面的顶部,点击“统计”选项卡,可以看到各种统计信息,如捕获的数据包数量、各层协议的数量等(在“每秒更新”下拉菜单中,选择适当值,例如“1秒”)。
  • 7.分析数据包:在“捕获”选项卡中,你可以看到实时捕获到的数据包。点击一个数据包,可以在右侧面板中查看该数据包的详细信息。你可以根据需要对数据包进行过滤、排序等操作,以便更好地分析网络流量。

使用tcpdump进行数据包嗅探的步骤如下:

  • 1.打开终端窗口并启动tcpdump。
  • 2.指定要嗅探的网络接口,例如:tcpdump -i eth0,其中“-i”后面跟着的是网络接口名称。
  • 3.抓取数据包,例如:tcpdump -i eth0 -w data.pcap,其中“-w”后面跟着的是输出文件的名称。
  • 4.分析和过滤数据包,例如:tcpdump -i eth0 host 192.168.1.101,表示只抓取目标主机为192.168.1.101的数据包。
  • 5.分析数据包的内容,可以使用工具如Wireshark打开刚刚保存的pcap文件进行进一步分析。

请注意,使用tcpdump需要具有管理员权限(sudo)。

对于网络安全人员,需要关注那些点

Sniff数据包实现流量统计的原理是基于网络数据包的捕获和解析。Sniff工具通过监听网络接口上的数据传输,对每个经过的数据包进行截获、分析和解码。然后,根据协议类型、源IP、目标IP、数据包长度等属性对数据包进行分类和统计。

对于网络安全人员,需要关注以下几点:

  • 1.Sniff工具的合法使用:Sniff工具主要用于网络管理、故障排查和程序调试等方面,也可以被黑客用来进行非法活动,如窃取敏感信息、进行网络攻击等。
  • 2.网络隔离和安全措施:为了保护网络安全,需要对网络进行适当的隔离和安全措施。例如,使用VLAN、防火墙等设备来限制网络访问和数据流动,以防止未经授权的访问和恶意攻击。
  • 3.数据包的过滤和分析:Sniff工具虽然可以对网络流量进行全面分析,但在实际应用中,可能需要对数据包进行过滤和筛选,以便更准确地掌握网络流量情况。例如,可以针对特定的协议、IP地址、端口等进行过滤,以排除无关数据包的干扰。
  • 4.警惕ARP欺骗攻击:ARP欺骗是一种常见的网络攻击手段,黑客通过伪造IP地址和MAC地址映射关系,可以截获网络数据包并进行恶意篡改。在使用Sniff工具时,需要防范ARP欺骗攻击,例如通过设置静态ARP映射表、使用ARP欺骗防御软件等措施来保护网络安全。

Linux C/C++ 嗅探数据包并显示流量统计信息

要实现嗅探数据包并根据网卡流量输出 TCP/UDP 流量信息,你可以参考以下步骤进行实现:安装并导入必要的库:首先,你需要安装一些库,如 libpcap(用于捕获和解析数据包)和 sys(用于获取系统时间)。

打开网络接口并捕获数据包:使用 libpcap 库打开网络接口(如 eth0),并设置过滤器(例如,仅捕获 TCP 和 UDP 数据包):

...
/* IP header */
struct sniff_ip {u_char  ip_vhl;                 /* version << 4 | header length >> 2 */u_char  ip_tos;                 /* type of service */u_short ip_len;                 /* total length */u_short ip_id;                  /* identification */u_short ip_off;                 /* fragment offset field */
#define IP_RF 0x8000            /* reserved fragment flag */
#define IP_DF 0x4000            /* dont fragment flag */
#define IP_MF 0x2000            /* more fragments flag */
#define IP_OFFMASK 0x1fff       /* mask for fragmenting bits */u_char  ip_ttl;                 /* time to live */u_char  ip_p;                   /* protocol */u_short ip_sum;                 /* checksum */struct  in_addr ip_src,ip_dst;  /* source and dest address */
};
#define IP_HL(ip)               (((ip)->ip_vhl) & 0x0f)
#define IP_V(ip)                (((ip)->ip_vhl) >> 4)/* 剩下的TCP和UDP标头结构仅用于学习目的,因为计算ip报头中的总分组长度 *//* TCP header */
typedef u_int tcp_seq;struct sniff_tcp {u_short th_sport;               /* source port */u_short th_dport;               /* destination port */tcp_seq th_seq;                 /* sequence number */tcp_seq th_ack;                 /* acknowledgement number */u_char  th_offx2;               /* data offset, rsvd */
#define TH_OFF(th)      (((th)->th_offx2 & 0xf0) >> 4)u_char  th_flags;
#define TH_FIN  0x01
#define TH_SYN  0x02
#define TH_RST  0x04
#define TH_PUSH 0x08
#define TH_ACK  0x10
#define TH_URG  0x20
#define TH_ECE  0x40
#define TH_CWR  0x80
#define TH_FLAGS        (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR)u_short th_win;                 /* window */u_short th_sum;                 /* checksum */u_short th_urp;                 /* urgent pointer */
};struct sniff_udp {u_short	uh_sport;		/* source port */u_short	uh_dport;		/* destination port */u_short	uh_ulen;		/* datagram length */u_short	uh_sum;			/* datagram checksum */
};
...
int main(int argc, char **argv) 
{
...while((argch = getopt(argc, argv, "Bkmgdi:t:")) != -1) {switch(argch) {case 'B':batch_mode = 1;break;case 'k':strncpy(show_suffix, "kByte/s", 32);traffic_unit = 1;break;case 'm':strncpy(show_suffix, "MByte/s", 32);traffic_unit = 2;break;case 'g':strncpy(show_suffix, "GByte/s", 32);traffic_unit = 3;break;case 't':sniff_timeout = atoi(optarg);break;case 'i':strncpy(ifname, optarg, IFNAMSIZ);break;case 'd':dflag = 1;break;default:fprintf(stderr, "Incorrect argument provided\n");usage();exit(1);}}/* 如果缺少位置筛选器参数,请退出。 */if(argc - optind < 1) {usage();exit(1);}/* 最后一个参数现在应该是筛选器字符串 */filter = argv[optind];/* 确定设备ifname的IPv4网络和网络掩码. */if(pcap_lookupnet(ifname, &netp, &netmask, errbuf) == -1) {fprintf(stderr, "pcap_lookupnet: %s\n", errbuf);exit(1);}if((capture = pcap_open_live(ifname, 65535, 1, 10, errbuf)) == NULL) {fprintf(stderr, "pcap_open_live: %s\n", errbuf);exit(1);}if(pcap_compile(capture, &comp_filter, filter, 0, netmask) != 0) {fprintf(stderr, "pcap_compile: %s\n", pcap_geterr(capture));exit(1);}if(pcap_setfilter(capture, &comp_filter) == -1) {fprintf(stderr, "pcap_setfilter: %s\n", pcap_geterr(capture));exit(1);}/* 清理回调 */if(atexit(exit_callback) != 0) {perror("atexit: ");exit(1);}/* 发出数据包捕获结束的信号. */if(signal(SIGALRM, output_data) == SIG_ERR) {perror("signal: failed to capture SIGALRM");exit(1);}/* 捕获中断信号以实现整洁的清理. */if(signal(SIGINT, cleanup_capture) == SIG_ERR) {perror("signal: failed to capture SIGINT");exit(1);}/* 获取NIC硬件地址以稍后确定数据包流. */if((mac_address = get_hw_address(ifname, dflag)) == NULL) {fprintf(stderr, "get_hw_address: failed to get hw address from %s\n", ifname);exit(1);}nic_dlt = pcap_datalink(capture);/* 选择一个物理层段大小 */switch(nic_dlt) {case DLT_EN10MB: /* Ethernet */phys_size = 14;break;case DLT_IEEE802: /* WiFi */phys_size = 22;break;case DLT_FDDI: /* Fiber interface */phys_size = 21;break;case DLT_LOOP: /* OpenBSD loop device or RAW device */phys_size = 12;break;case DLT_NULL:phys_size = 4;default:phys_size = 0;break;}if(dflag)fprintf(stderr, "phys_size: %d, nic_dlt: %d\n", phys_size, nic_dlt);/* 清除计时器结构并设置sniff_timeout秒的超时. */
.../* 这将导致发送SIGALARM以输出当前流量统计信息。. */if(setitimer(ITIMER_REAL, itvp, &oitv) < 0) {fprintf(stderr, "setitimer: failed setting timer\n");exit(1);}if(batch_mode == 0)output_header(ifname);/* 将捕获缓冲区中数据包的主pcap循环. */loop_status = pcap_loop(capture, -1, capture_callback, NULL);
...
}...
void fprint_data(double in, double out) 
{switch(traffic_unit) {case 1:in /= 1000;out /= 1000;break;case 2:in /= 1000000;out /= 1000000;break;case 3:in /= 1000000000;out /= 1000000000;break;default:in /= 1;out /= 1;break;}...
}
...
unsigned short get_windowsize(void) {struct winsize ws;if(ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) < 0) {return(-1);}return(ws.ws_row);
}
...
uint8_t * get_hw_address(char *ifname, int dflag) 
{
...ifap = ifa;if(sd < 0) {freeifaddrs(ifap);return(NULL);}for(;ifa;ifa = ifa->ifa_next) {if(ifa->ifa_data != 0) {continue;}/* 查找是否与ifname匹配 */if(strncmp(ifname, ifa->ifa_name, sizeof(*ifname)) == 0) {strncpy(req.ifr_name, ifa->ifa_name, IFNAMSIZ);if(ioctl(sd, SIOCGIFHWADDR, &req ) != -1 ) {if((mac = malloc(sizeof(uint8_t)*MAX_ETHER_LEN)) == NULL) {perror("malloc: ");return(NULL);}memcpy(mac, (uint8_t*)req.ifr_ifru.ifru_hwaddr.sa_data, MAX_ETHER_LEN);break;}}}freeifaddrs(ifap);return mac;
}

If you need the complete source code, please add the WeChat number (c17865354792)

运行结果:

根据字节数和时间计算 TCP 和 UDP 的流量(以字节/秒为单位),将 TCP 和 UDP 的流量信息按照指定的格式(如 k/s、m/s 等)输出到控制台。

总结

嗅探数据包是一种网络抓包技术,可以捕获网络上传输的数据包并进行分析。通过统计流量,可以了解网络的使用情况、发现异常行为和攻击等。

Welcome to follow WeChat official account【程序猿编码

相关文章:

Linux C/C++ 嗅探数据包并显示流量统计信息

嗅探数据包并显示流量统计信息是网络分析中的一种重要技术&#xff0c;常用于网络故障诊断、网络安全监控等方面。具体来说&#xff0c;嗅探器是一种可以捕获网络上传输的数据包&#xff0c;并将其展示给分析人员的软件工具。在嗅探器中&#xff0c;使用pcap库是一种常见的方法…...

Vitis导入自制IP导致无法构建Platform

怎么还有这种问题&#xff08; 解决Vitis导入自制IP导致无法构建Platform – TaterLi 个人博客 Vitis报错&#xff1a;fatal error: xxx.h: No such file or directory._ly2lj的博客-CSDN博客 在指定位置黏入以上代码即可&#xff1a; INCLUDEFILES$(wildcard *.h) LIBSOUR…...

SQLAlchemy 使用封装实例

类封装 database.py #! /usr/bin/env python # -*- coding: utf-8 -*-import sys import json import logging from datetime import datetimefrom core.utils import classlock, parse_bool from core.config import (MYSQL_HOST,MYSQL_PORT,MYSQL_USER,MYSQL_PASS,MYSQL_DA…...

Android Framework通信:Binder

文章目录 前言一、Linux传统跨进程通信原理二、Android Binder跨进程通信原理1、动态内核可加载模块2、内存映射3、Binder IPC 实现原理 三、Android Binder IPC 通信模型1、Client/Server/ServiceManager/驱动Binder与路由器之间的角色关系 2、Binder通信过程3、Binder通信中的…...

如何用精准测试来搞垮团队?

测试行业每年会冒出来一些新鲜词&#xff1a;混沌工程、精准测试、AI测试…… 这些新概念、新技术让我们感到很焦虑&#xff0c;逼着自己去学习和了解这些新玩意&#xff0c;担心哪一天被淘汰掉。 以至于给我这样的错觉&#xff0c;当「回归测试」、「精准测试」这两个词摆在一…...

暴力递归转动态规划(十)

题目 给定一个二维数组matrix[][]&#xff0c;一个人必须从左上角出发&#xff0c;最终到达右下角&#xff0c;沿途只可以向下或者向右走&#xff0c;沿途的数字都累加就是距离累加和。返回最小距离累加和。 这道题中会采用压缩数组的算法来进行优化 暴力递归 暴力递归方法的整…...

深度学习-房价预测案例

1. 实现几个函数方便下载数据 import hashlib import os import tarfile import zipfile import requests#save DATA_HUB dict() DATA_URL http://d2l-data.s3-accelerate.amazonaws.com/def download(name, cache_diros.path.join(.., data)): #save"""下载…...

【26】c++设计模式——>命令模式

c命令模式 C的命令模式是一种行为模式&#xff0c;通过将请求封装成对象&#xff0c;以实现请求发送者和接受者的解耦。 在命令模式中&#xff0c;命令被封装成一个包含特定操作的对象&#xff0c;这个对象包含的执行该操作的方法&#xff0c;以及一些必要的参数。命令对象可以…...

ElasticSearch容器化从0到1实践(一)

背景 通过kubernetes集群聚合多个Elasticsearch集群碎片资源&#xff0c;提高运维效率。 介绍 Kubernetes Operator 是一种特定的应用控制器&#xff0c;通过 CRD&#xff08;Custom Resource Definitions&#xff0c;自定义资源定义&#xff09;扩展 Kubernetes API 的功能…...

【Vue面试题二十四】、Vue项目中有封装过axios吗?主要是封装哪方面的?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;Vue项目中有封装过axios…...

旅游票务商城小程序的作用是什么

随着环境放开&#xff0c;旅游行业恢复了以往的规模&#xff0c;本地游、外地游成为众多用户选择&#xff0c;而在旅游时&#xff0c;不少人会报名旅行团前往各风景热点游玩&#xff0c;对旅游票务经营者而言&#xff0c;市场高需求的同时也面临一些难题。 对旅游票务经营商家…...

LabVIEW在安装了其它的NI软件之后崩溃了

LabVIEW在安装了其它的NI软件之后崩溃了 在安装了其它的NI软件之后&#xff0c;一些原本安装好的或者新安装的软件由于缺少必要的DLL而崩溃掉了。例如&#xff0c;在这种情况下&#xff0c;Teststand可能会报下面的错误&#xff1a; RetrievingCOM class factory for compone…...

基于Java的个人健康管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...

nginx https的配置方法

文章目录 安装证书工具安装根证书生成域名证书配置转发 ssl的请求到http请求 安装证书工具 curl ‘http://pan.itshine.cn:5080/?explorer/share/fileOut&shareID64h6PiQQ&path%7BshareItemLink%3A64h6PiQQ%7D%2F%E5%B7%A5%E5%85%B7%2Fmkcert’ > ‘./mkcert’ c…...

使用WebDriver采样器将JMeter与Selenium集成

目录 第一步&#xff1a;在JMeter中添加Selenium / WebDriver插件 第二步&#xff1a;创建一条测试计划--添加线程组 第三步&#xff1a;下载 chromedriver.exe 第四步&#xff1a;在Web Driver 采样器中添加测试脚本 第五步&#xff1a;运行并且验证 注意&#xff1a; 第…...

flink教程

文章目录 来自于尚硅谷教程1. Flink概述1.1 特点1.2 与SparkStreaming对比 2. Flink部署2.1 集群角色2.2 部署模式2.3 Standalone运行模式2.3.1 本地会话模式部署2.3.2 应用模式 2.4 YARN运行模式2.4.1 会话模式部署2.4.2 应用模式部署 2.5 历史服务 3. 系统架构3.1 并行度3.2 …...

视频监控系统/安防视频平台EasyCVR广场视频细节优化

安防视频监控系统/视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防视频汇聚平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;可实现视频监控直播、视频轮播、…...

电脑上播放4K视频需要具备哪些条件?

在电视上播放 4K&#xff08; 4096 2160 像素&#xff09;视频是很简单的&#xff0c;但在电脑设备上播放 4K 视频并不容易。相反&#xff0c;它们有自己必须满足的硬件要求。 如果不满足要求&#xff0c;在电脑上打开 4K 分辨率文件或大型视频文件会导致卡顿、音频滞后以及更…...

测试除了点点点,还有哪些内容呢?

今天和一个网友讨论了一下关于互联网行业中测试的情况&#xff0c;希望能够了解现在的互联网行业主要的测试工作内容。小编根据以往的工作经历和经验情况&#xff0c;来做一个总结和整理。 1、岗位分类 现在的岗位划分主要是分为两大类&#xff1a;测试工程师 和 测试开发工程…...

HTTP的本质理解

HTTP是超文本传输协议&#xff0c;从协议、传输和超文本三个关键词进行进行分解。 协议关键词讲解 1.协议的第一个词是协&#xff0c;这个就表明需要至少两方参与到其中。 2.协议的第二个词是议&#xff0c;表明HTTP是规范和约定&#xff0c;需要大家共同遵守&#xff0c;也包…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...