網絡抓包分析工具

摘要

隨著網絡技術的快速發展,網絡數據的傳輸和處理變得日益復雜。網絡抓包分析工具作為網絡故障排查、性能優化以及安全審計的重要工具,對于提升網絡管理的效率和準確性具有重要意義。本文旨在設計并實現一款高效、易用的網絡抓包分析工具,以滿足現代網絡管理的需求。
在工具設計方面,本文首先對網絡抓包的基本原理和常用技術進行了深入研究,包括數據包捕獲、數據展示等關鍵環節。基于這些原理和技術,本文提出了一種基于多線程和異步處理的數據包捕獲機制,以提高抓包效率和響應速度。同時,工具還采用了模塊化的設計思想,使得協議解析和數據展示等功能可以靈活擴展和定制。
在實現過程中,本文利用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 65535int 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和目的ipobjects[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.pswp.cn/diannao/36776.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36776.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/36776.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

期末測試一

字符數組的排序注意的問題 &#xff1a; 1.對于輸入字符的時候 如果給出了要輸入幾個字符 n >>>>> for ( i 0 ; i < n ;i ) { scanf("%c",&ch); } 如果說直到輸入到換行符結束 >>>>>>while ( ch! \ n ) 這個需要額…

CSS|04 復合選擇器偽類選擇器屬性選擇器美化超鏈接

基本選擇器&#xff1a;見上篇基本選擇器 復合選擇器選擇器1,選擇器2{屬性:值;} 多元素選擇器&#xff0c;同時匹配選擇器1和選擇器2&#xff0c;多個選擇器之間用逗號分隔舉例&#xff1a; p,h1,h2{margin:0px;}E F{屬性:值;} 后代元素選擇器&#xff0c;匹配所有屬于E元素后…

基于長短時記憶網絡LSTM的TE過程故障診斷(MATLAB R2021B)

實驗所用 TE 仿真過程的數據集是網上公開的數據集&#xff0c;該數據集中的訓練集和測試集分別包含 20 種故障工況和一種正常工況數據&#xff0c;其中所采集的每個樣本信號包含 41 個測量變量和 11 個控制變量&#xff0c;所以每個時刻采集到的樣本有 52 個觀測變量。 TE 仿真…

NoSQL之Redis配置與管理

目錄 一、關系型數據庫和非關系型數據庫 1.關系型數據庫 2.非關系型數據庫 3.關系型數據庫和非關系型數據庫區別 二、Redis 1.Redis簡介 2.Redis 的優點 3.Redis 使用場景 4.Redis的數據類型 5.哪些數據適合放入緩存中&#xff1f; 6.Redis為什么這么快&#xff1f;…

BUG:AttributeError: module ‘websocket‘ has no attribute ‘enableTrace’

AttributeError: module ‘websocket’ has no attribute enableTrace’ 環境 windows 11 Python 3.10websocket 0.2.1 websocket-client 1.8.0 websockets 11.0.3 rel 0.4.9.19詳情 一開始…

ActiveMQ camel

游覽器輸入地址: http://127.0.0.1:8161/admin/ 訪問activemq管理臺 賬號和密碼默認為: admin/admin# yml配置的密碼也是如下的密碼 activemq:url: failover:(tcp://localhost:61616)username: adminpassword: adminComponent public class ActiveMqReceiveRouter extends Rout…

AudioLM音頻生成模型

GPT-4o (OpenAI) AudioLM&#xff08;Audio Language Model&#xff09;是一種生成音頻的深度學習模型。它可以通過學習語言模型的結構來生成連貫和高質量的音頻信號。這類模型通常應用于語音合成、音樂生成和音頻內容生成等領域。以下是一些與AudioLM相關的核心概念和技術細…

【JavaEE進階】Spring AOP使用篇

目錄 1.AOP概述 2.SpringAOP快速入門 2.1 引入AOP依賴 2.2 編寫AOP程序 3. Spring AOP詳解 3.1 Spring AOP 核心概念 3.1.1切點(Pointcut) 3.1.2 連接點 (Join Point) 3.1.3 通知(Advice) 3.1.4 切面(Aspect) 3.2 通知類型 3.3PointCut 3.4 切面優先級 3.5 切點表…

基于經典滑膜控制的永磁同步電機調速系統MATLAB仿真

滑膜控制器 取PMSM狀態變量為&#xff1a; ωref為目標轉速&#xff0c;ωm為電機輸出轉速。將此式求導得&#xff1a; 定義系統滑模面函數為&#xff1a; 對滑模面函數求導 在電機實際控制時&#xff0c;滑模控制方法存在高頻抖振問題&#xff0c;則需要選取合適的指數趨近率…

web前端——css(一篇教會網頁制作)

目錄 一、基本語法 1.行內樣式表 2.內嵌樣式表 3.外部樣式表 二、選擇器 1.標簽選擇器 2.類選擇器 3.id 選擇器 4.通配選擇器 三、常見修飾 1.文本 2.背景 3.列表 4.偽類 5.透明度 6.塊級、行級、行級塊標簽 7.div 和 span 四、盒子模型&#xff08;重點&…

【PostgreSQL】守護數據安全:事務與數據完整性管理

目錄 事務管理&#xff1a;確保操作的原子性 事務的概念與重要性 事務的啟動與提交 事務的回滾&#xff08;ROLLBACK&#xff09;&#xff08; 數據一致性與隔離級別 隔離級別的解釋 設置隔離級別 錯誤處理與事務的高級策略 異常處理&#xff08;SAVEPOINT & EXCE…

25屆最近5年重慶郵電大學自動化考研院校分析

重慶郵電大學 目錄 一、學校學院專業簡介 二、考試科目指定教材 三、近5年考研分數情況 四、近5年招生錄取情況 五、最新一年分數段圖表 六、歷年真題PDF 七、初試大綱復試大綱 八、學費&獎學金&就業方向 一、學校學院專業簡介 二、考試科目指定教材 1、考試…

[數據集][目標檢測]電纜鋼絲繩線纜缺陷檢測數據集VOC+YOLO格式1800張3類別

數據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數)&#xff1a;1800 標注數量(xml文件個數)&#xff1a;1800 標注數量(txt文件個數)&#xff1a;1800 標注…

單例模式(下)

文章目錄 文章介紹步驟安排及單例講解step1&#xff1a;注冊單例類型&#xff08;main.cpp&#xff09;step2&#xff1a;定義類和私有構造函數&#xff08;keyboardinputmanager.h&#xff09;step3:&#xff08;keyboardinputmanager.cpp&#xff09;step4&#xff1a;在qml中…

雷卯一站式解決電子設備靜電浪涌與接口安全

在快速演進的數字時代&#xff0c;電子設備不僅是日常生活的核心&#xff0c;更是工業自動化、智能穿戴、智能家居乃至未來交通的基石。然而&#xff0c;隨著技術邊界的不斷拓展&#xff0c;設備面臨的挑戰也日益嚴峻&#xff0c;尤其是來自靜電放電(ESD)、浪涌沖擊及電磁干擾的…

【2024最新華為OD-C/D卷試題匯總】[支持在線評測] 特殊加密算法(200分) - 三語言AC題解(Python/Java/Cpp)

&#x1f36d; 大家好這里是清隆學長 &#xff0c;一枚熱愛算法的程序員 ? 本系列打算持續跟新華為OD-C/D卷的三語言AC題解 &#x1f4bb; ACM銀牌&#x1f948;| 多次AK大廠筆試 &#xff5c; 編程一對一輔導 &#x1f44f; 感謝大家的訂閱? 和 喜歡&#x1f497; &#x1f…

Rust 跨平臺-Android 和鴻蒙 OS

1. 安裝 rustup rustup 是 Rust 的安裝和版本管理工具 $ curl --proto https --tlsv1.2 https://sh.rustup.rs -sSf | sh 該命令會安裝 rusup 和最新的穩定版本的 Rust&#xff1b;包括&#xff1a; rustc Rust 編譯器&#xff0c;用于將 Rust 代碼編譯成可執行文件或庫。 ca…

技術速遞|Visual Studio Code 的 .NET MAUI 擴展現已正式發布

作者&#xff1a;Maddy Montaquila 排版&#xff1a;Alan Wang 今天&#xff0c;我們非常高興地宣布 .NET MAUI VS Code 擴展插件結束了預覽階段&#xff0c;并將包含一些期待已久的新功能 - 包括 XAML IntelliSense 和 Hot Reload&#xff01; 什么是 .NET MAUI 擴展插件&…

GuLi商城-商品服務-API-三級分類-刪除-頁面效果

一步步學習Vue太慢了&#xff0c;準備跳過前端的學習&#xff0c;直接使用前端完整的項目 下載依賴npm install&#xff0c;會報錯&#xff0c;排查了好久 我安裝的是Node14&#xff0c;所以必須要安裝4.14 Vscode終端輸入&#xff1a;npm install node-sass4.14 輸入&#x…

【Android面試八股文】如果需要在Activity間傳遞大量的數據怎么辦?

文章目錄 1. 使用Intent傳遞數據2. 使用靜態變量3. 使用Parcelable或Serializable接口4. 使用文件5. 使用數據庫存儲6. 使用ContentProvider7. 匿名共享內存(Ashmem)總結在Android開發中,如果需要在Activity之間傳遞大量數據,可以采取以下幾種方法: 1. 使用Intent傳遞數據…