网络抓包分析工具

news2024/9/21 14:54:15

摘要

随着网络技术的快速发展,网络数据的传输和处理变得日益复杂。网络抓包分析工具作为网络故障排查、性能优化以及安全审计的重要工具,对于提升网络管理的效率和准确性具有重要意义。本文旨在设计并实现一款高效、易用的网络抓包分析工具,以满足现代网络管理的需求。
在工具设计方面,本文首先对网络抓包的基本原理和常用技术进行了深入研究,包括数据包捕获、数据展示等关键环节。基于这些原理和技术,本文提出了一种基于多线程和异步处理的数据包捕获机制,以提高抓包效率和响应速度。同时,工具还采用了模块化的设计思想,使得协议解析和数据展示等功能可以灵活扩展和定制。
在实现过程中,本文利用Java编程语言和Jnetpcap,完成了网络抓包分析工具的编码工作。工具实现了对多种网络协议(如TCP、UDP等)的解析功能,并能够以直观的方式展示数据包的结构和内容。此外,工具还提供了丰富的过滤功能,方便用户快速定位和分析目标数据包。
通过实际测试和应用,本文设计的网络抓包分析工具表现出了良好的性能和稳定性。在抓包速度、解析精度以及用户体验等方面均达到了预期目标。该工具不仅为网络管理人员提供了有力的支持,也为网络技术的研究和发展提供了有价值的参考。
关键词:网络抓包工具;数据包捕获;数据包分析;数据包存储;TCP; UDP;

结构安排

本文主要围绕网络抓包分析工具的设计与实现展开论述。全文结构分为七个部分,具体如下:
(1)绪论:介绍网络抓包技术的基本概念、发展历程及其在网络安全、网络游戏等领域的重要作用,明确本文的研究目的和意义。
(2)相关技术:阐述网络抓包技术所涉及的关键技术,包括Jnetpcap技术、Java Swing技术、IO流等,为理解网络抓包分析工具的实现奠定基础。
(3)需求分析:详细分析本网络抓包分析工具的功能需求、性能需求和安全需求,为后续设计与实现提供依据。
(4)工具设计:基于上述技术原理,详细设计网络抓包分析工具的整体架构、功能模块及其交互方式,明确各模块的功能和实现方法。
(5)工具实现:介绍网络抓包分析工具的具体实现过程,包括关键代码编写、调试和优化,以及如何利用HOOK技术、DLL技术等实现对网络数据的拦截和分析。
(6)测试与分析:通过实际案例展示网络抓包分析工具在网络安全、网络游戏等方面的应用,验证工具的有效性和实用性。
(7)结论与展望:总结全文,阐述网络抓包分析工具的研究成果和价值,并对未来发展趋势进行展望。
本文旨在为网络抓包技术的研究和应用提供理论依据和实践指导,通过对网络抓包分析工具的设计与实现,进一步推动网络抓包技术在各个领域的广泛应用。

需求概述

网络数据包分析工具要实现五个功能, 数据包的捕获、数据包的解析、数据包信息分析和数据包的信息显示以及数据存储。数据包的捕获和解析是系统的基础部分, 数据包信息的分析和显示是对数据的处理部分。五个模块相互协调共同对当前主机的网络数据包进行分析。
在这里插入图片描述

数据包解析需求分析

数据包解析需求分析的关键在于确定所需捕获的网络数据包类型。一般来说,需要关注以下几种数据包类型:

  1. 网络层数据包:主要包括 IP、ICMP、IGMP 等协议的数据包,这些数据包承载了网络层以上的协议数据,是网络通信的基础。
  2. 传输层数据包:主要包括 TCP 和 UDP 协议的数据包。TCP 数据包具有可靠的数据传输特性,而 UDP 数据包则具有较低的传输延迟。捕获这些数据包有助于分析网络应用的传输性能和可靠性。
  3. 应用层数据包:包括 HTTP、FTP、DNS 等常见网络应用协议的数据包。分析这些数据包可以深入了解网络应用的运行状态、性能瓶颈以及潜在的安全问题。
  4. 特殊协议数据包:例如 ARP、RARP、ICMP 等,这些数据包在特定场景下具有重要价值,如 ARP 攻击分析、网络故障诊断等。
    在数据包解析过程中,需要提取有价值的信息,如源地址、目的地址、端口号、协议类型等。这些信息将有助于对网络流量进行分类、统计和分析。
    此外,针对不同场景和需求,根据预设的条件,筛选出符合条件的数据包。例如,可以设置过滤特定主机、特定端口、特定协议等。对捕获的数据包进行深入解析,如解析 HTTP 请求内容、FTP 文件传输过程等。
    数据包信息显示需求分析
    数据包显示内容应涵盖以下几个关键要素:时间戳、源地址、目的地址、协议类型、数据包长度、发送速率等。这些信息有助于用户快速了解数据包的基本情况,从而进行更深入的分析。此外,为了方便用户识别,数据包中的关键字段(如源地址、目的地址等)应支持颜色标注、字体加粗等视觉提示。
    数据包信息的展示方式应直观易懂。一种有效的方式是采用分层次展示策略,将数据包按照时间顺序、协议类型等进行分类,便于用户快速定位感兴趣的数据包。此外,支持数据包列表和详细信息两种展示模式,让用户在需要时能够方便地切换查看方式。对于复杂的数据包分析,提供图表统计功能,如协议占比、速率分布等,以帮助用户快速了解网络状况。
    在用户交互方面,设计应注重易用性。提供直观的过滤和排序功能,让用户能够根据需求筛选和排序数据包。支持多种数据包视图,如原始数据、二进制数据等,以满足不同用户的分析需求。

数据包信息分析需求分析

抓包工具应当具备对捕获的数据包进行深度分析的能力,并能提供一系列详尽的指标数据,以便用户全面了解网络传输的详细情况。这些指标数据包括但不限于数据包的总数,即捕获到的数据包的总量;错误包数,即在传输过程中出现错误或异常的数据包数量;以及速率,即数据包传输的速率,这可以反映出网络的繁忙程度和传输效率。通过这些数据的呈现,用户能够更为精准地评估网络性
能,及时发现并解决潜在问题。

用户管理需求分析

用户使用本抓包工具抓取到的数据包需要存储在各自用户独立拥有的文件内,而不是所有用户共享所有抓取到的网络数据包,这就需要辨别出每次使用此抓包工具的用户。
用户在注册界面提交自己的相关注册信息来实现用户账号以及本地文件夹的生成,为后续相关操作提供相关权限。用户通过输入正确的用户名和密码来访问其个人账户。

数据包信息存储需求分析

存储需求应满足多样性。由于网络数据包涉及多种协议,如TCP、UDP、ICMP等,存储结构应能兼容这些协议的相关信息。同时,存储结构应具备可扩展性,以便在未来添加新的协议或功能时能方便地进行调整。
数据包信息的存储应具备高效性。在存储过程中,尽量减少数据包的处理时间,提高抓包工具的性能。这可以通过优化存储算法、使用快速的数据结构以及高效的数据存储格式等方式实现。
存储需求应具备良好的兼容性。抓包工具需要支持多种操作系统和平台,如Windows、Linux、Mac等。因此,存储结构应能适应不同操作系统的特点,确保数据包信息的完整性和准确性。
数据包存储需求还应考虑安全性。在存储过程中,应对数据包进行加密处理,以防止数据泄露和篡改。同时,加密算法应具备较高的性能,以平衡安全性和存储效率。

系统模块划分

网络抓包分析工具的设计与实现主要包括四个模块:网络抓包模块、数据解析模块、数据分析模块和可视化模块。
网络抓包模块是整个系统的核心部分,负责实时捕获网络流量中的数据包。该模块采用WinPcap库作为基础,通过socket接口与底层网络设备进行通信,实现对数据包的捕获。在此过程中,模块需要处理多种网络协议,如TCP、UDP、ARP等,并实现对数据包的解析,提取出感兴趣的信息。
数据解析模块负责对捕获到的数据包进行深入分析。该模块主要包括两个部分:一是协议解析,将数据包从原始二进制数据转换为可读的协议数据单元,如IP、TCP、UDP等;二是内容解析,提取出数据包中的关键信息,如源地址、目的地址、端口号、数据 payload 等。
数据分析模块对解析后的数据进行处理和分析。该模块主要包括数据统计、趋势分析、异常检测等功能。通过这些功能,用户可以快速了解网络流量的整体状况,发现潜在的问题和风险。
可视化模块将分析结果以图表和报表的形式展示给用户。该模块支持多种可视化方式,如折线图、柱状图、饼图等,帮助用户直观地了解网络状况,从而做出合理的决策。
系统的总体模块图如下图4.1所示:
在这里插入图片描述
在这里插入图片描述

系统实现

数据包捕获模块实现
数据包捕获模块依赖于操作系统提供的网络接口驱动程序来实现。使用Jnetpcap来捕获网络数据包。通过Jnetpcap,可以实现对网络数据包的捕获和解析。
为了确保捕获到的数据包完整且准确,我们需要在捕获过程中对数据包进行过滤。过滤模块根据预先设定的条件,如IP地址、端口号、协议类型等,对捕获到的数据包进行筛选。只有满足条件的数据包才会被送往后续处理模块进行分析。
关键代码如下:

public Pcap startCap(JPanel contentPane,int netInterface,String filterExpre) {
	PcapIf devIf = allDevs.get(netInterface);
	// 截取长度不超过数据报max 65535
	int snaplen = 64 * 1024; 
	// 混杂模式,抓取所有数据包
	int flags = Pcap.MODE_PROMISCUOUS; 
	int timeout = 1 * 1000; // 超时
	Pcap pcap = Pcap.openLive(devIf.getName(), snaplen, flags, timeout,
			errbuf);
	if (pcap == null) {
		JOptionPane.showMessageDialog(contentPane,"Error while opening device for capture: "+errbuf.toString(),"错误 ",0);
		return null;
	}
	String msgString;
	if(!filterExpre.equals(""))
		msgString = this.setFilter(pcap, filterExpre);
	else {
		msgString="ok";
	}
	if(msgString!="ok") {
		JOptionPane.showMessageDialog(contentPane,msgString,"错误 ",0);
	}

数据包解析模块实现
数据包解析模块支持多种网络协议,如 IP、TCP、UDP、HTTP、DNS 等。对于不同协议的数据包,模块会根据协议特点进行针对性解析。例如,对于 IP 数据包,模块可以提取源 IP 地址、目的 IP 地址、协议类型等信息;对于 TCP 数据包,模块可以提取源端口、目的端口、序列号、确认号等信息;对于 HTTP 数据包,模块可以提取请求方法、URL、请求头、请求体等信息。关键代码如下:

// 根据协议类型,设置协议字段(objects[2])
if (packet.hasHeader(Ethernet.ID)) {// 解析Ethernet,获取MAC地址
	Ethernet ethernet = packet.getHeader(new Ethernet());
	objects[4] = AddressUtil.macBytesToString(ethernet.source());
	objects[7] = AddressUtil.macBytesToString(ethernet.destination());
}
if (packet.hasHeader(Ip4.ID)) {// 解析IP,获取IP地址
	Ip4 ip = packet.getHeader(new Ip4());
	objects[2] = "ip4";
	objects[5] = AddressUtil.ipBytesToString(ip.source());
	objects[8] = AddressUtil.ipBytesToString(ip.destination());
}
if (packet.hasHeader(Ip6.ID)) {// 解析IP,获取IP地址
	Ip6 ip = packet.getHeader(new Ip6());
	objects[2] = "ip6";
	objects[5] = AddressUtil.ipBytesToString(ip.source());
	objects[8] = AddressUtil.ipBytesToString(ip.destination());
}
if (packet.hasHeader(Tcp.ID)) {// 解析TCP,获取端口号
	Tcp tcp = packet.getHeader(new Tcp());
	objects[2] = "tcp";
	objects[6] = tcp.source();
	objects[9] = tcp.destination();
}
if (packet.hasHeader(Udp.ID)) {// 解析UDP,获取端口号
	Udp udp = packet.getHeader(new Udp());
	objects[2] = "udp";
	objects[6] = udp.source();
	objects[9] = udp.destination();
}
if (packet.hasHeader(new Arp())) {// 解析Arp,获取源ip和目的ip
	objects[2] = "arp";
	Arp arp = packet.getHeader(new Arp());
	objects[5] = AddressUtil.ipBytesToString(arp.spa());
	objects[8] = AddressUtil.ipBytesToString(arp.tpa());
}
if (packet.hasHeader(Icmp.ID)) { 	objects[2] = "icmp";}

数据包信息显示模块实现
展示捕获到的数据包,包括数据包序号、时间、发送方和接收方IP地址等信息。用户可以在这里查看各个数据包的详细信息。为了提高用户体验,还设计了实时更新功能,当有新的数据包被捕获时,模块会自动更新显示列表,确保用户能够实时查看最新的数据包信息。核心代码如下:

FlatIntelliJLaf.setup();
MainFrame frame = new MainFrame();
frame.setVisible(true);
public MainFrame() {
setTitle("网络抓包");
// 获取网卡即描述信息
allDevs = netCap.getDevList();
descList = this.netCap.getDescList();
//设置窗口的默认操作
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 920, 550);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(new BorderLayout(0, 0));
}
panel = new JPanel();
contentPane.add(panel, BorderLayout.NORTH);
panel.setLayout(new FormLayout(new ColumnSpec[] { FormSpecs.LABEL_COMPONENT_GAP_COLSPEC,
       ColumnSpec.decode("45px"), ColumnSpec.decode("352px"), ColumnSpec.decode("59px"),
       ColumnSpec.decode("78px"), ColumnSpec.decode("95px"), FormSpecs.RELATED_GAP_COLSPEC,
       FormSpecs.DEFAULT_COLSPEC, FormSpecs.RELATED_GAP_COLSPEC, ColumnSpec.decode("max(7dlu;default)"),
       ColumnSpec.decode("128px"), }, new RowSpec[] { RowSpec.decode("23px"), }));

数据包显示实现效果如下图4.6所示:
在这里插入图片描述
数据包信息分析模块实现
数据分析功能通过统计功能以及用户自定义的过滤器实现。例如,用户可以分析某个IP地址的流量分布,找出异常流量并采取相应措施。此外,通过将抓取到的数据包保存为PCAP文件,用户可以在后续时间进行分析,方便进行故障排查和性能优化。数据包信息分析模块可以帮助用户更好地理解网络流量,发现并解决潜在问题,提高网络性能。
TCP协议的数据包,其结构包含多个字段。以下是TCP协议各字段的详细解析:
源端口:表示发送方的端口号,范围为0-65535。
目的端口:表示接收方的端口号,范围与源端口相同。
序列号:用于标识TCP流中发送的字节的起始位置。TCP连接中传送的数据流中的每一个字节都编上一个序号,序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
确认号:表示期望收到对方的下一个报文段的数据的第一个字节的序号。
数据偏移:表示TCP头部长度,以32位字为单位。
保留字段:当前未使用,为未来使用而保留。
控制位:包含多个控制标志,如URG(紧急)、ACK(确认)、PSH(推送)、RST(重置)、SYN(同步)、FIN(终止)等。
窗口大小:用于实现TCP的流量控制。它告诉对方本端的接收窗口大小,单位是字节。
校验和:用于校验TCP头部和数据的完整性。发送端计算校验和,接收端进行验证。
紧急指针:当URG控制位被设置时,该字段有效,指出紧急数据在TCP数据部分的偏移量。
选项:TCP头部可以包含可选项,用于支持额外的功能或参数。常见的选项包括最大段大小(MSS)、窗口扩大因子、时间戳等。
数据:这是TCP报文段的主要部分,包含要传输的实际数据。其长度受MTU(最大传输单元)和窗口大小的限制。
TCP协议分析核心代码如下:

StringBuilder builder = new StringBuilder();
builder.append(parseEthernet());
if(packet.hasHeader(Ip4.ID))
    builder.append(parseIp());
else {
    builder.append(parseIp6());
}
Tcp tcp = packet.getHeader(new Tcp());
builder.append("------------------Tcp------------------\n");
builder.append("源端口(2字节):" + tcp.source() + "\n");
builder.append("目的端口(2字节):" + tcp.destination() + "\n");
builder.append("序号(4字节):" + tcp.seq() + "\n");
builder.append("确认号(4字节):" + tcp.ack() + "\n");
builder.append("数据偏移(4位)[首部长度]:" + tcp.hlen() + " [ 4 bytes ]\n");
builder.append("保留(6位):" + tcp.reserved() + "\n");
builder.append("紧急URG(1位):" + boolToInt(tcp.flags_URG()) + "\n");
builder.append("确认ACK(1位)[1-确认号有效]:" + boolToInt(tcp.flags_ACK()) + "\n");
builder.append("推送PSH(1位):" + boolToInt(tcp.flags_PSH()) + "\n");
builder.append("复位RST(1位):" + boolToInt(tcp.flags_RST()) + "\n");
builder.append("同步SYN(1位):" + boolToInt(tcp.flags_SYN()) + "\n");
builder.append("终止FIN(1位):" + boolToInt(tcp.flags_FIN()) + "\n");
builder.append("窗口(2字节):" + tcp.window() + "\n");
builder.append("检验和(2字节):" + tcp.checksum() + "\n");
builder.append("紧急指针(2字节)[URG=1时有意义]:" + tcp.urgent() + "\n\n");
return builder.toString();

在这里插入图片描述
UDP是计算机网络中的一种无连接的传输层协议,它为应用程序提供了一种无需建立连接就可以发送封装的原始IP数据报的方法。以下是UDP协议数据包各字段解析:
源端口:表示发送方的端口号,用于标识发送应用程序。
目的端口:表示接收方的端口号,用于标识接收应用程序。
长度:表示UDP头部和UDP数据的总长度(以字节为单位)。
校验和:用于验证UDP头部和数据的完整性。发送方计算校验和,接收方进行验证。如果校验和不匹配,则数据报会被丢弃。
UDP协议分析核心代码如下:

StringBuilder builder = new StringBuilder();
builder.append(parseEthernet());
if(packet.hasHeader(Ip4.ID))
    builder.append(parseIp());
else {
    builder.append(parseIp6());
}
Udp udp = packet.getHeader(new Udp());
builder.append("------------------Udp------------------\n");
builder.append("源端口(2字节):" + udp.source() + "\n");
builder.append("目的端口(2字节):" + udp.destination() + "\n");
builder.append("长度(2字节)[整个UDP数据报长度]:" + udp.length() + "\n");
builder.append("检验和(2字节):" + udp.checksum() + "\n\n");
return builder.toString();

在这里插入图片描述
ARP是用于将网络层的32位IP地址解析为数据链路层的48位MAC地址的协议。以下是ARP协议报文各字段的解析:
硬件类型:标识ARP报文所使用的硬件地址类型。
协议类型:标识ARP报文所映射的协议地址类型。
硬件地址长度:标识硬件地址的字节长度。
协议地址长度:标识协议地址的字节长度。
操作码:标识ARP报文的类型。常见的操作码有: ARP请求,ARP应答,RARP请求,RARP应答。
发送方硬件地址:标识发送ARP报文的主机的硬件地址。
发送方协议地址:标识发送ARP报文的主机的协议地址(如IP地址)。
目标硬件地址:标识ARP报文所请求解析的硬件地址。
目标协议地址:标识ARP报文所请求解析的协议地址。

ARP协议分析核心代码如下:

StringBuilder builder = new StringBuilder();
builder.append(parseEthernet());
Arp arp = packet.getHeader(new Arp());
builder.append("------------------Arp------------------\n");
builder.append("硬件类型(2字节):" + arp.hardwareType() + " [ " + arp.hardwareTypeDescription() + " ] \n");
builder.append("协议类型(2字节):" + arp.protocolType() + " [ " + arp.protocolTypeDescription() + " ] \n");
builder.append("硬件地址长度(1字节):" + arp.hlen() + " [ bytes ] \n");
builder.append("协议长度(1字节):" + arp.plen() + " [ bytes ] \n");
builder.append("操作类型op(2字节):" + arp.operation() + " [ " + arp.operationDescription() + " ] \n");
builder.append("发送方MAC(6字节):" + AddressUtil.macBytesToString(arp.sha()) + "\n");
builder.append("发送方Ip(4字节):" + AddressUtil.ipBytesToString(arp.spa()) + "\n");
builder.append("接收方MAC(6字节):" + AddressUtil.macBytesToString(arp.tha()) + "\n");
builder.append("接收方Ip(4字节):" + AddressUtil.ipBytesToString(arp.tpa()) + "\n\n");

在这里插入图片描述
ICMP是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。ICMP协议对于网络诊断非常有用,例如用于检测网络是否通畅、路由是否可用等。以下是ICMP报文各字段的解析:
类型:标识ICMP报文的类型。
代码:对于某些ICMP报文类型,代码字段提供了额外的信息。不是所有的ICMP报文类型都使用代码字段,对于某些类型,该字段的值被设置为0。
校验和:用于检测ICMP报文在传输过程中是否发生错误。
标识符:用于标识ICMP请求和应答之间的关联。
序列号:用于标识ICMP报文的一个序列号。
数据:包含与ICMP报文类型相关的数据。不同的ICMP报文类型可能有不同的数据格式和长度。
ICMP协议分析核心代码如下:

StringBuilder builder = new StringBuilder();
builder.append(parseEthernet());
if(packet.hasHeader(Ip4.ID))
    builder.append(parseIp());
else {
    builder.append(parseIp6());
}
Icmp icmp = packet.getHeader(new Icmp());
builder.append("------------------Icmp------------------\n");
builder.append("类型(8位):" + icmp.type() + " [ " + icmp.typeDescription() + "] \n");
builder.append("代码(8位):" + icmp.code() + " \n");
builder.append("检验和(16位):" + icmp.checksum() + " \n");
builder.append("标识符(16位):" + icmp.getId() + "\n\n");
return builder.toString();

在这里插入图片描述
用户登录注册模块实现
用户使用登录功能,输入用户账户账号和密码,当用户点击登录按钮,会触发单击事件,执行get方法,将输入的账户和密码写入JavaBean,通过与数据库user表中的name与pwd字段比较,若登录的用户存在,则登录成功。
核心代码如下所示:

User user = new User(username,password);
IUserService userService = new UserServiceImpl();
User userCheck = userService.check(user);
if (userCheck!= null) {
    userCausal = userCheck;
    JOptionPane.showMessageDialog(contentPane, "登录成功!", "提示", JOptionPane.PLAIN_MESSAGE);
}else{
    JOptionPane.showMessageDialog(contentPane, "没有此用户请先注册", "提示", JOptionPane.PLAIN_MESSAGE);
}

在这里插入图片描述
用户使用注册功能,输入注册账户的账号名和密码,当用户点击注册按钮,
会触发单机事件,执行get方法,将输入的账户和密码写入JavaBean,通过与数据库user表中的name字段比较,若注册的用户不存在,则向数据库user表加入待注册用户数据,并在本地为此用户创建文件夹,注册成功。
核心代码如下:

if(username!=null && password!=null && !username.equals("") && !password.equals("")){
    User user = new User(username,password);
    IUserService userService = new UserServiceImpl();
    userService.save(user);
    File file = new File("E:\\Data\\"+username);
if(!file.exists()){
    file.mkdir();
}
    JOptionPane.showMessageDialog(contentPane, "用户注册成功!", "提示", JOptionPane.PLAIN_MESSAGE);
}

在这里插入图片描述
数据包信息存储模块实现
在本工具中,采用 Java的IO流来实现数据包的存储。具体来说,将解析后的数据包信息拼接成字符串进行存储。
在抓取数据包后,在服务端生成数据包的临时文件
关键代码如下

String data = "序号:" + objects[0] + "" +
		",时间:" + objects[1] +
		",类别:" + objects[2] +
		",长度:" + objects[3] +
		",源MAC:" + objects[4] +
		",源IP:" + objects[5] +
		",源端口:" + objects[6] +
		",目的MAC:" + objects[7] +
		",目的IP:" + objects[8] +
		",目的端口:" + objects[9] + "\r\n";
	FileUtils.write(new File("data1.txt"), data, "UTF-8", true);

在这里插入图片描述

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

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

相关文章

从ChatGPT代码执行逃逸到LLMs应用安全思考

摘要 11月7日OpenAI发布会后,GPT-4的最新更新为用户带来了更加便捷的功能,包括Python代码解释器、网络内容浏览和图像生成能力。这些创新不仅开辟了人工智能应用的新境界,也展示了GPT-4在处理复杂任务方面的惊人能力。然而,与所有…

OZON与WB平台自养号测评:优势与搭建步骤解析

随着俄罗斯跨境电商市场的蓬勃发展,OZON和WB平台吸引了越来越多的国内卖家入驻。为了提升产品权重、增加曝光度并加速销售,许多卖家选择通过自养号测评的方式来优化店铺运营。自养号测评在OZON和WB平台上具有多重显著优势。 一、自养号测评的优势 1. 权…

C++编程(一)C++与C语言的一些区别

文章目录 一、QtCreator基本使用(一)编码格式:(二)C编程1. 文件后缀2. 编译3. 头文件 二、名字空间(一)概念以及访问方式1. 概念2. 访问方式(1)通过作用域限定符进行访问…

如何看待AIGC中漫画版权争议?( 计育韬老师高校公益巡讲答疑实录2024)

这是计育韬老师第 8 次开展面向全国高校的新媒体技术公益巡讲活动了。而在每场讲座尾声,互动答疑环节往往反映了高校师生当前最普遍的运营困境,特此计老师在现场即兴答疑之外,会尽量选择有较高价值的提问进行文字答疑梳理。 *本轮巡讲主题除了…

QT拖放事件之五:自定义拖放操作-拖动中的修饰符操作

1、效果 2、代码 #include "SelfButton.h" #include <QApplication>SelfButton::SelfButton(QString str ,QWidget* parent):Q

嵌入式Linux系统编程 — 4.3 strcat、strcpy函数拼接与复制字符串

目录 1 字符串拼接 1.1 strcat函数 1.2 strncat函数 1.3 示例程序 2 字符串复制 2.1 strcpy函数 2.2 strncpy函数 2.3 示例程序 1 字符串拼接 1.1 strcat函数 在Linux系统中&#xff0c;strcat 函数是C语言标准库中的一个函数&#xff0c;用于将一个字符串追加到另一…

深度解析百数多标签技术:让数据处理更加精准与高效

百数的多标签功能允许用户在单个表单或应用中创建多个独立的标签页&#xff0c;每个标签页可以包含不同的字段和数据。这有助于清晰组织和管理表单内容&#xff0c;使数据结构更加分明。用户可以根据需要添加、删除或重新排序标签&#xff0c;轻松管理复杂数据&#xff0c;提高…

Kafka入门到精通(三)-Kafka

Kafka简介 Kafka是由Apache软件基金会开发的一个开源流处理平台&#xff0c;由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。 这种动作&#xff08;网页浏览&#xff0c;搜索和其他用户的行动&#xf…

Kali系统的中英文切换

执行命令&#xff1a;sudo dpkg-reconfigure locales 命令作用&#xff1a;重新生成locales配置文件并允许你重新选择所需的语言环境。 中文&#xff1a;zh_CN.UTF-8 UTF-8 英文&#xff1a;en_US.UTF-8 UTF-8 用空格键选中和取消选项。 要设置成中文&#xff1a;取消选择en…

我教会了我妈搭建自己的 AI 聊天机器人...

在这个人工智能爆发的年代,ChatGPT、Claude、Kimi、文心一言等 AI 大模型产品火遍全网,仿佛一夜之间,人人都在谈论 AI。 作为普通人的我们,难道就只能看着程序员们尽情玩耍,自己却无法参与其中吗?NO! 鉴于最近自己社群学员和粉丝的要求&#xff0c;一进来大家无论是不是小白…

springboot的特点是什么?

Spring Boot是一个基于Spring框架的开源项目&#xff0c;它旨在简化Spring应用的初始搭建和开发过程。以下是Spring Boot的一些主要特点&#xff1a; 快速开发&#xff1a; Spring Boot提供了许多默认配置&#xff0c;使得开发者可以更快地开始开发应用程序&#xff0c;而无需…

Centos+Jenkins+Maven+Git 将生成的JAR部署到Jenkins服务器上

背景:前一篇写的是Jenkins和项目应用服务器不在同一个服务器上。但是有的公司可能不会给Jenkins单独弄一个服务器。可能就会出现Jenkins就搭建在某一个应用服务器上。这种情况的参考如下的操作。 1、登录 没有安装的参考下面的安装步骤先安装: Jenkins安装手册 输入账号、…

PT100(RTD)是什么?2线,3线,4线原理

RTDs - or Resistance Temperature Detectors- (电阻式温度探测器)&#xff0c;是温度型传感器&#xff0c;包含一个电阻&#xff0c;这个阻值可以随温度的变化而变化。在工业的进程中和实验室里已经使用了很多年&#xff0c;以精确&#xff0c;可靠和稳定的特性。 2线制 2线制…

linux的常用系统维护命令

1.ps显示某个时间点的程序运行情况 -a &#xff1a;显示所有用户的进程 -u &#xff1a;显示用户名和启动时间 -x &#xff1a;显示 没有控制终端的进程 -e &#xff1a;显示所有进程&#xff0c;包括没有控制终端的进程 -l &#xff1a;长格式显示 -w &#xff1a;宽…

聊一聊 C# 弱引用 底层是怎么玩的

一&#xff1a;背景 1. 讲故事 最近在分析dump时&#xff0c;发现有程序的卡死和WeakReference有关&#xff0c;在以前只知道怎么用&#xff0c;但不清楚底层逻辑走向是什么样的&#xff0c;借着这个dump的契机来简单研究下。 二&#xff1a;弱引用的玩法 1. 一些基础概念 …

主播美颜工具开发全攻略:美颜SDK从基础到进阶的技术指南

今天&#xff0c;笔者将为你详细介绍美颜SDK的基础知识以及如何进行进阶开发。 一、美颜SDK基础知识 什么是美颜SDK&#xff1f; 美颜SDK是一种软件开发工具包&#xff0c;包含了一系列用于图像处理的算法和功能&#xff0c;主要用于实时视频处理和图像优化。开发者可以将美…

计算机基础——经典排序算法总结2

直接插入排序的过程&#xff1a;先将序列第一个记录暂时作为有序子序列&#xff0c;从第二个开始逐个进行插入&#xff0c;直至整个序列有序。一趟排序将elem[i]插入到已排好序elem[0…i-1]中各元素做比较后的任何对应位置&#xff0c;所以未必能选出一个元素放在其最终位置上。…

自定义 vant 的 van-calendar 日历控件

最近在做 vue 微信公众号项目&#xff0c; 有个自定义日历控件展示的需求&#xff0c;经过查阅资料&#xff0c;最终实现了如图所示效果&#xff0c;这里做了总结&#xff0c;需要的小伙伴可以参考一下&#xff1a; HTML代码&#xff1a; <template><div class"…

YOLOv10(7):YOLOv10训练(以训练VOC数据集为例)

YOLOv10&#xff08;1&#xff09;&#xff1a;初探&#xff0c;训练自己的数据_yolov10 训练-CSDN博客 YOLOv10&#xff08;2&#xff09;&#xff1a;网络结构及其检测模型代码部分阅读_yolov10网络结构图-CSDN博客 YOLOv10&#xff08;4&#xff09;&#xff1a;损失&…

每日一题——Python实现蓝桥杯1. 坤坤的破译任务(举一反三+思想解读+逐步优化)三千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 时间复杂度&#xff1a; 空间复杂度&#xff1a; 我要更强 时间复杂度分析…