1. 程式人生 > >計算機網路實驗-網路嗅探器

計算機網路實驗-網路嗅探器

  						計算機網路實驗-網路嗅探器
  1. 內容
    課題:簡單的個人網路嗅探器
    一、目的
    加深對 TCP/IP 協議的理解
    二、任務:
    • 實現 Sniffer 的基本功能。 Sniffer 是一種用於監測網路效能、使用情況的工具。
    • 能夠指定需要偵聽的網絡卡(考慮一臺機器上多張網絡卡的情況)
    • 能夠偵聽所有進出本主機的資料包,解析顯示資料包( ICMP 、 IP 、 TCP 、 UDP 等)各個欄位。比如,對 IP 頭而言,需要顯示 版本、頭長度、服務型別、資料包長度、標識、 DF/MF 標誌、段內偏移、生存期、協議型別、源目的 IP 地址、選項內容、資料內容。要求顯示資料的實際含義(例如用 ASCII 表示);
    • 能夠偵聽來源於指定 IP 地址的資料包,能夠偵聽指定目的 IP 地址的資料包,顯示接收到的 TCP 和 UDP 資料包的全部實際內容。需要考慮一個 TCP 或 UDP 包劃分為多個 IP 包傳輸的情況;
    • 能夠根據指定的協議型別來過慮包,例如,只偵聽 ICMP 包,或只偵聽 ICMP 和 UDP 包。
    • 功能驗證手段:在執行 Sniffer 的同時,執行標準的 Ping 、 Telnet 和瀏覽網頁等操作,檢查 Sniffier 能否返回預期的結果。
    • 資料包儲存:可以儲存選中的包,儲存檔案要有可讀性。
    • 檔案重組:一個檔案在傳輸過程中,被分成若干個 TCP 包傳送,如果抓到經過本機的該檔案的所有 TCP 包,將這些包重組還原出該檔案。
    • 查詢功能:例如查詢內容中包含 ”password” 的包,並集中顯示。
    三、要求:
    • Windows 平臺上可以用 winpcap 類庫;在 linux 平臺上可以使用 libpcap 類庫。也可以呼叫 Sockets 等有關的網路類庫。

解釋:
這次實驗的題目使用Java來實現的,主要就是需要用到Java的很多的包和類來實現網路的一些功能,比如抓包,繫結網絡卡…等操作。
當然我使用的是IntelliJ IDEA Community Edition 2018.3.2 x64(簡稱IDE),這個過程也需要一些教程,我會在另外的一個部落格裡面細緻講述吧。
地址: 安裝地址

總體的實驗也是根據一些大佬的指導,參考。比如 >大佬一<, ,>大佬二<。

先看一下這個簡單的程式碼(此程式碼同樣是來自上面那位大佬的)
程式碼1:

import java.io.IOException;

import jpcap.*;
import jpcap.packet.IPPacket;
import jpcap.packet.Packet;
import jpcap.packet.TCPPacket;


public class Main {

    public static void main(String[] args) {
        /*--------------	第一步繫結網路裝置       --------------*/
        NetworkInterface[] devices = JpcapCaptor.getDeviceList();

        for (NetworkInterface n : devices) {
            System.out.println(n.name + "     |     " + n.description);
        }
        System.out.println("-------------------------------------------");

        JpcapCaptor jpcap = null;
        int caplen = 1512;
        boolean promiscCheck = true;

        try {
            jpcap = JpcapCaptor.openDevice(devices[0], caplen, promiscCheck, 50);
            //0 或 1
        } catch (IOException e) {
            e.printStackTrace();
        }

        /*----------第二步抓包-----------------*/
        int i = 0;
        while (i < 10) {
            Packet packet = jpcap.getPacket();
            if (packet instanceof IPPacket && ((IPPacket) packet).version == 4) {
                i++;
                IPPacket ip = (IPPacket) packet;// 強轉
                System.out.println("版本:IPv4");
                System.out.println("優先權:" + ip.priority);
                System.out.println("區分服務:最大的吞吐量: " + ip.t_flag);
                System.out.println("區分服務:最高的可靠性:" + ip.r_flag);
                System.out.println("長度:" + ip.length);
                System.out.println("標識:" + ip.ident);
                System.out.println("DF:Don't Fragment: " + ip.dont_frag);
                System.out.println("NF:Nore Fragment: " + ip.more_frag);
                System.out.println("片偏移:" + ip.offset);
                System.out.println("生存時間:" + ip.hop_limit);

                String protocol = "";
                switch (new Integer(ip.protocol)) {
                    case 1:
                        protocol = "ICMP";
                        break;
                    case 2:
                        protocol = "IGMP";
                        break;
                    case 6:
                        TCPPacket tcp = (TCPPacket) packet;// 強轉
                        protocol = "TCP";
                        break;
                    case 17:
                        protocol = "UDP";
                        break;
                    default:
                        break;
                }
                System.out.println("協議:" + protocol);
                System.out.println("源IP " + ip.src_ip.getHostAddress());
                System.out.println("目的IP " + ip.dst_ip.getHostAddress());
                System.out.println("源主機名: " + ip.src_ip);
                System.out.println("目的主機名: " + ip.dst_ip);
                System.out.println("----------------------------------------------");
            }
        }
    }

}

執行結果:

改的過程主要就是根據老師給的題目和查閱jpcap的JDK而得到的。
我把一些JDK整理了一下:JDK查閱地址
改變程式碼2:

import jpcap.*;
import jpcap.packet.Packet;
import jpcap.packet.IPPacket;
import jpcap.packet.TCPPacket;
import jpcap.packet.ICMPPacket;
import jpcap.packet.UDPPacket;

import java.nio.charset.StandardCharsets;
import java.util.Scanner;
import java.io.IOException;


public class Sniffer {

    public static void main(String[] args) throws IOException {

        /*************  第一步:繫結網絡卡****************/
        NetworkInterface[] devices = JpcapCaptor.getDeviceList();//獲取本機的網路介面列表
//      NetworkInterface[]搜尋具有繫結到其的指定Internet協議(IP)地址的網路介面的便捷方法。
//如果指定的IP地址繫結到多個網路介面,則不會定義返回哪個網路介面。
//        此類表示由名稱和分配給此介面的IP地址列表組成的網路介面。
//        它用於標識加入多播組的本地介面。介面通常以諸如“le0”之類的名稱而為人所知。
//介面物件包含了對應網路介面的一些資訊,名稱、描述、IP以及MAC地址以及資料鏈路層名稱和描述
        //輸出各種網絡卡
        for(int i = 0 ; i < devices.length ; i++){
            System.out.println(devices[i].name +"   網絡卡描述:   "+devices[i].description);
        }
        System.out.println("-------------------------------------------");

//        一旦有了網路介面列表就可以從選定用於捕獲資料包的網路介面,
//        可以使用方法JpcapCaptor.openDevice()來開啟網路介面
        System.out.println("請輸入你想要測試的網絡卡: (此電腦在連結YTU時只有‘1’可以用,在連線有線時‘0’也可用)");
        Scanner reader = new Scanner(System.in);
        int n = reader.nextInt();

        JpcapCaptor jpcap = null;
        try {
             jpcap = JpcapCaptor.openDevice(devices[n], 65535, true, 10);
            //0 或 1
// 初始化網路介面,並且返回Jpcap類的例項:
// static Jpcap openDevice(String device,int snaplen,boolean promisc ,int to_ms)
// device引數是網路介面的名字;
// snaplen引數是一次捕獲的最大位元組數量;
// promisc引數,如果為true,介面被設定為混雜模式;
// to_ms引數,設定processPacket()中的Timeout;當指定介面不能被開啟丟擲IO異常。
        } catch (IOException e) {
            e.printStackTrace();
//在命令列列印異常資訊在程式中出錯的位置及原因。
        }
//catch(…)能夠捕獲多種資料型別的異常物件,所以它提供給程式設計師一種對異常物件更好的控制手段,
// 使開發的軟體系統有很好的可靠性。
//                jpcap.setFilter("IP and TCP",true);
        /*二:抓包*/

        //        過濾
        System.out.println("請輸入你想要找的協議:");
        System.out.println("****************************");
        System.out.println("提示:  -1  表示輸出全部的協議 ");
        System.out.println("        1  表示ICMP協議  ");
        System.out.println("        6  表示TCP協議");
        System.out.println("        17 表示UDP協議");
        System.out.println("****************************");
        int s0 = reader.nextInt();
        String protocols = "";
        int k=0;
        int counts=0;

        while( k < 10 ){
            Packet packet = jpcap.getPacket();
//返回一個捕獲的資料包

            if (packet instanceof IPPacket ){
//判斷其左邊物件是否為其右邊類的例項,返回boolean型別的資料
                IPPacket ip = (IPPacket) packet;// 強轉
//              進行過濾初始化處理
                int s1;
                s1=new Integer( ip.protocol ) ;
                if(s0==-1)
                    s0=s1;
                k++;

//              進入協議輸出處理
                if(s0==s1) {
                    counts++;
//                  將位元組碼轉換為ascii
                    byte [] b;
                    b=ip.data;
                    String s=new String(b, StandardCharsets.US_ASCII);
//                  輸出顯示
                    System.out.println("    這是抓到的第" + k + "個包");
                    System.out.println("版本:IPv" + ip.version);
                    System.out.println("資料包長度:" + ip.length);
                    System.out.println("資料內容:" + s);
                    System.out.println("標識:" + ip.ident);
                    if (ip.version == 4) {
                        System.out.println("IPv4 報頭的選項:" + ip.option);
                        System.out.println("片偏移:" + ip.offset);
                        System.out.println("DF:Don't Fragment: " + ip.dont_frag);
                        System.out.println("MF:More Fragment: " + ip.more_frag);
                        System.out.println("分組標識:" + ip.ident);
                    }
                    else {
                        System.out.println("IPv6 報頭的選項:" + ip.options);
                    }
                    switch (s0) {
                        case 1:
                            protocols = "ICMP";
                            ICMPPacket icmp = (ICMPPacket) packet;// 強轉
                            System.out.println("ICMP部分");
                            System.out.println("ICMP報文型別:" + icmp.type);
                            System.out.println("ICMP報文程式碼: " + icmp.code);
                            System.out.println("校驗和:" + icmp.checksum);
                            System.out.println("序列號:" + icmp.seq);
                            System.out.println("子網掩碼:" + icmp.subnetmask);
                            System.out.println("生存時間:" + icmp.alive_time);
                            System.out.println("發起時間戳:" + icmp.orig_timestamp);
                            System.out.println("傳送時間戳:" + icmp.trans_timestamp);
                            break;
                        case 6:
                            protocols = "TCP";
                            TCPPacket tcp = (TCPPacket) packet;// 強轉
                            System.out.println("TCP部分");
                            System.out.println("源埠號: " + tcp.src_port);
                            System.out.println("目的埠號: " + tcp.dst_port);
                            System.out.println("視窗: " + tcp.window);
                            System.out.println("序號: " + tcp.sequence);
                            System.out.println("URG標誌: " + tcp.urg);
                            System.out.println("緊急指標: " + tcp.urgent_pointer);
                            System.out.println("ACK標誌: " + tcp.ack);
                            System.out.println("ACK確認號: " + tcp.ack_num);
                            System.out.println("FIN標誌: " + tcp.fin);
                            break;
                        case 17:
                            protocols = "UDP";
                            UDPPacket udp = (UDPPacket) packet;// 強轉
                            System.out.println("UDP部分");
                            System.out.println("源埠號" + udp.src_port);
                            System.out.println("目的埠號" + udp.dst_port);
                            System.out.println("UDP包長度 " + udp.length);
                            break;
                        default:
                            break;
                    }
                    System.out.println("----------------------");
                    System.out.println("協議型別:" + protocols);
                    System.out.println("未知:" + ip.d_flag);
                    System.out.println("生存期:" + ip.hop_limit);
                    System.out.println("資料包長度:" + ip.length);
                    System.out.println("優先權:" + ip.priority);
                    System.out.println("源IP " + ip.src_ip.getHostAddress());
                    System.out.println("目的IP " + ip.dst_ip.getHostAddress());
                    System.out.println("服務型別: " + ip.rsv_tos);

                    System.out.println("區分服務:最大的吞吐量: " + ip.t_flag);
                    System.out.println("區分服務:最高的可靠性:" + ip.r_flag);
                    System.out.println("源主機名: " + ip.src_ip);
                    System.out.println("目的主機名: " + ip.dst_ip);
                    System.out.println("----------------------------------------------");
                    
                }
            }
        }
        if ( counts == 0 )
            System.out.println("在此次抓包中沒有你想要的協議!");
    }
}

程式碼二執行結果:

注:
一: 一些簡單API的查閱
1. 獲取網路介面列表
要想從網路中捕獲資料包,第一件必須要做的事就是獲取本機的網路介面列表。Jpcap提供了方法JpcapCaptor.getDeviceList()完成這個任務,該方法返回一組NetworkInterface物件。  NetworkInterface介面物件包含了對應網路介面的一些資訊,例如:名稱、描述、IP以及MAC地址以及資料鏈路層名稱和描述。

2. 開啟網路介面
一旦有了網路介面列表就可以從選定用於捕獲資料包的網路介面,可以使用方法,JpcapCaptor.openDevice()來開啟網路介面。

3. 從網路介面捕獲資料包
一旦獲得了JpcapCaptor例項就可以用來捕獲來自網路介面的資料包。使用JpcapCaptor例項來捕獲資料包主要有兩種方法: 回撥(callback)以及逐個捕獲(one-by-one)
回撥方法 
實現的細節: 首先定義一個實現PacketReceiver介面的類。PacketReceiver介面中定義了receivePacket()方法,只需實現receivePacket()這個方法。
然後可以使用回撥的方法呼叫JpcapCaptor.processPacket()或JpcapCaptor.loopPacket()方法開始資料包的捕獲。processPacket()或loopPacket()方法可以指定捕獲的資料包的數量。-1表示無限地捕獲資料包。
兩種回撥方法:processPacket()和loopPacket()非常相似。通常建議使用processPacket(),因為它支援超時以及非阻塞模式,而loopPacket()並不支援。
逐個捕獲:
使用回撥方法稍微有點複雜,因為並不知道Jpcap什麼時候呼叫回撥方法。如果不使用回撥方法,可以呼叫JpcapCaptor.getPacket()方法來捕獲資料包。
getPacket()只是簡單返回一個捕獲的資料包,可以多次使用getPacket()方法捕獲連續的資料包。

4. 設定捕獲過濾器
在Jpcap中可以設定過濾器使得Jpcap不捕獲不需要的資料包。例如:如果僅僅只需捕獲TCP/IPv4資料包,就可以設定過濾器,其方法如下例所示:

5. 將捕獲的資料包存擋
可以將捕獲的資料包寫入一個二進位制檔案,事後使用Jpcap或支援tcpdump格式檔案的其它應用程式進行查詢。
儲存捕獲的資料包首先需要使用JpcapWriter.openDumpFile()開啟一個檔案,引數分別是用來捕獲資料包的一個JpcapCaptor例項以及String檔名。
一旦通過openDumpFile()方法獲得一個JpcapWriter的例項,就可以使用JpcapWriter.writePacket()儲存捕獲的資料包。將所有要儲存的資料都儲存之後,必須使用JpcapWriter.close()方法關閉開啟的檔案。

6. 讀入檔案中的資料包
在Jpcap中,可以使用JpcapCaptor.openFile()方法開啟一個由JpcapWriter儲存的檔案,並從中讀入資料包。類似於JpcapCaptor.openDevice()方法,JpcapCaptor.openFile()方法將返回一個JpcapCaptor類的例項,因此可以使用“從網路介面捕獲資料包”中描述的方式來從檔案中讀取資料包。

7. 通過網路介面傳送資料包
傳送一個數據包首先需要呼叫JacapSender.openDevice()或JacapSender.getJpcapSenderInstance()方法。
一旦獲得一個JpcapSender例項,就可以將Packet類例項傳遞給JpcapSender.sendPacket()方法。

二: 關於Java寫入檔案的一些方法:

  1. FileWritter寫入檔案
    FileWritter, 字元流寫入字元到檔案。預設情況下,它會使用新的內容取代所有現有的內容,然而,當指定一個true (布林)值作為FileWritter建構函式的第二個引數,它會保留現有的內容,並追加新內容在檔案的末尾。
    (1).替換所有現有的內容與新的內容。
    new FileWriter(file);
    (2).保留現有的內容和附加在該檔案的末尾的新內容。
    new FileWriter(file,true);
  2. BufferedWriter寫入檔案
    緩衝字元(BufferedWriter )是一個字元流類來處理字元資料。不同於位元組流(資料轉換成位元組),你可以直接寫字串,陣列或字元資料儲存到檔案。
  3. FileOutputStream寫入檔案
    檔案輸出流是一種用於處理原始二進位制資料的位元組流類。為了將資料寫入到檔案中,必須將資料轉換為位元組,並儲存到檔案。請參閱下面的完整的例子。

三: 用java關於將 byte 數組裡存的是ascii碼,怎麼轉成字串
byte[] b=new byte[]{65,66,67,68};//位元組陣列
String s=new String(b,“ascii”);//第二個引數指定編碼方式
System.out.print(s);

四: Java中比較兩個字串是否相等的問題
下面將分析使用 (注意:Java中 = 是賦值運算子, 是比較是否相等) 和 equals()方法 來比較兩個字串相等的區別:
“==” 比較的是兩個字串的地址是否為相等(同一個地址), equals() 方法比較的是兩個字串物件的內容是否相同(當然,若兩個字串引用同一個地址,使用equals()比較也返回true)。

例1. 使用new關鍵字宣告兩個String型別的變數

 String s1 = new String("abc");
  String s2 = new String("abc");
 
       //分別使用.equals()和==進行比較
         if(s1.equals(s2))
       {
          System.out.println("可以使用 equals  來比較");
       }else
       {
          System.out.println("不可以使用 equals  來比較");
       }
       if(s1 == s2)
       {
          System.out.println("可以使用== 來比較");
       }else  
       {
          System.out.println("不可以使用== 來比較");
      }

執行程式發現,用equals比較返回true,用 == 比較返回false。原因如下:

因為 “” 比較的是兩個字串物件的地址是否相同(是否為同一個地址),當使用new關鍵字建立一個物件的時候,該物件單獨佔據一塊儲存空間,存放llg這個字串的值。所以s1 s2兩個字串雖然值相同,但是儲存的地址不是一個地址,例如兩個人都叫l“李四”但是他們的住址不在一個地方。當使用 “”來比較的時候,比較的是兩個字串的地址是否是同一個,所以返回false。但是使用equals()方法比較這兩個字串,將會比較兩個字串的值是否相同,所以返回true。

五: Java寫入檔案實現換行

file.write( " \r\n " );

最後放一個自已寫的東西吧。
其實這個寫的就像是資料結構,不斷地重複工作,實現一些功能。

import jpcap.*;
import jpcap.packet.Packet;
import jpcap.packet.IPPacket;
import jpcap.packet.TCPPacket;
import jpcap.packet.ICMPPacket;
import jpcap.packet.UDPPacket;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
import java.io.IOException;
import java.util.regex.*;

public class sniffers {

    public static void main(String[] args) throws IOException {

        /*************  第一步:繫結網絡卡****************/
        NetworkInterface[] devices = JpcapCaptor.getDeviceList();//獲取本機的網路介面列表
        for (int i = 0; i < devices.length; i++) {
            System.out.println(devices[i].name + "   網絡卡描述:   " + devices[i].description);
        }
        System.out.println("-------------------------------------------");
        System.out.println("請輸入你想要測試的網絡卡:  ");
        Scanner reader = new Scanner(System.in);
        int n = reader.nextInt();
//      初始化網路介面
        JpcapCaptor jpcap = null;
        try {
//          初始化網路介面,並且返回Jpcap類的例項:
            jpcap = JpcapCaptor.openDevice(devices[n], 65535, true, 10);
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("請輸入你想要找的指定的目的IP地址:");
        System.out.println("提示:  1.輸入你想要找的源IP地址(形如 202.194.116.116)");
        System.out.println("       2.“-1”:任意源IP地址");
        String IPSourcein=reader.next();//指定源IP

        System.out.println("請輸入你想要匹配的字串:");
        System.out.println("提示: 任何有關字元皆可(空串也符合)");
        String str=reader.next();  //字串匹配

        System.out.println("請輸入你想要找的協議:");
        System.out.println("****************************");
        System.out.println("提示:  -1  表示輸出全部的協議 ");
        System.out.println("        1  表示ICMP協議  ");
        System.out.println("        6  表示TCP協議");
        System.out.println("        17 表示UDP協議");
        System.out.println("****************************");
        int s0 = reader.nextInt();//選擇協議

//      變數引數宣告
        String protocols = null;
        int IPpacketnum = 0;  //抓到IP包的個數
        int IPnum=0;  //IP個數
        int Pnum = 0;  //協議個數
        int Stringnum=0;  //字元個數
        while (IPpacketnum < 50) {
            Packet packet = jpcap.getPacket();
            if (packet instanceof IPPacket) {
                IPpacketnum++;
                IPPacket ip = (IPPacket) packet;// 強轉

//              將位元組碼轉為ascii
                byte[] b;
                b = ip.data;
                String s = new String(b, StandardCharsets.US_ASCII);

//              源IP處理
                String IPSourceexam="-1";
                String IPSourceget=ip.src_ip.getHostAddress();
                if(IPSourcein.equals(IPSourceexam)){
                    IPSourcein=IPSourceget;
                }

//              子串匹配處理
                int index=s.indexOf(str);

//              協議號處理
                int s1;  //協議號
                s1 = new Integer(ip.protocol);
                if (s0 == -1)
                    s0 = s1;

                if( IPSourcein.equals(IPSourceget) && index != -1 ) {
                    Stringnum++;
                    IPnum++;
                    if (s0 == s1) {
                        Pnum++;

//                  輸出顯示
                        System.out.println("    這是抓到的第" + IPpacketnum + "個IP包");
                        System.out.println("版本:IPv" + ip.version);
                        System.out.println("資料包長度:" + ip.length);
                        System.out.println("資料內容:" + s);
                        System.out.println("標識:" + ip.ident);
                        if (ip.version == 4) {
                            System.out.println("IPv4 報頭的選項:" + ip.option);
                            System.out.println("片偏移:" + ip.offset);
                            System.out.println("DF:Don't Fragment: " + ip.dont_frag);
                            System.out.println("MF:More Fragment: " + ip.more_frag);
                            System.out.println("分組標識:" + ip.ident);
                        } else {
                            System.out.println("IPv6 報頭的選項:" + ip.options);
                        }
                        switch (s0) {
                            case 1:
                                protocols = "ICMP";
                                ICMPPacket icmp = (ICMPPacket) packet;// 強轉
                                System.out.println("ICMP部分");
                                System.out.println("ICMP報文型別:" + icmp.type);
                                System.out.println("ICMP報文程式碼: " + icmp.code);
                                System.out.println("校驗和:" + icmp.checksum);
                                System.out.println("序列號:" + icmp.seq);
                                System.out.println("子網掩碼:" + icmp.subnetmask);
                                System.out.println("生存時間:" + icmp.alive_time);
                                System.out.println("發起時間戳:" + icmp.orig_timestamp);
                                System.out.println("傳送時間戳:" + icmp.trans_timestamp);
                                break;
                            case 6:
                                protocols = "TCP";
                                TCPPacket tcp = (TCPPacket) packet;// 強轉
                                System.out.println("TCP部分");
                                System.out.println("源埠號: " + tcp.src_port);
                                System.out.println("目的埠號: " + tcp.dst_port);
                                System.out.println("視窗: " + tcp.window);
                                System.out.println("序號: " + tcp.sequence);
                                System.out.println("URG標誌: " + tcp.urg);
                                System.out.println("緊急指標: " + tcp.urgent_pointer);
                                System.out.println("ACK標誌: " + tcp.ack);
                                System.out.println("ACK確認號: " + tcp.ack_num);
                                System.out.println("FIN標誌: " + tcp.fin);
                                break;
                            case 17:
                                protocols = "UDP";
                                UDPPacket udp = (UDPPacket) packet;// 強轉
                                System.out.println("UDP部分");
                                System.out.println("源埠號" + udp.src_port);
                                System.out.println("目的埠號" + udp.dst_port);
                                System.out.println("UDP包長度 " + udp.length);
                                break;
                            default:
                                break;
                        }
                        System.out.println("----------------------");
                        System.out.println("協議型別:" + protocols);
                        System.out.println("未知:" + ip.d_flag);
                        System.out.println("生存期:" + ip.hop_limit);
                        System.out.println("資料包長度:" + ip.length);
                        System.out.println("優先權:" + ip.priority);
                        System.out.println("源IP " + ip.src_ip.getHostAddress());
                        System.out.println("目的IP " + ip.dst_ip.getHostAddress());
                        System.out.println("服務型別: " + ip.rsv_tos);

                        System.out.println("區分服務:最大的吞吐量: " + ip.t_flag);
                        System.out.println("區分服務:最高的可靠性:" + ip.r_flag);
                        System.out.println("源主機名: " + ip.src_ip);
                        System.out.println("目的主機名: " + ip.dst_ip);
                        System.out.println("----------------------------------------------");
//                      寫入檔案
                        try {
                            FileWriter file = new FileWriter("1.txt", true);
                            file.write(IPpacketnum+". "+s+"\r\n");
                            file.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                    }
                }
            }
        }

        if (IPpacketnum==0)
            System.out.println("此網絡卡沒有抓到IP!");
            else if(IPnum == 0)
                System.out.println("沒有找到指定的源IP地址!");
            else if(Stringnum==0)
                System.out.println("沒有找到能夠匹配的串!");
            else if (Pnum == 0)
                System.out.println("在此次抓包中沒有你想要的協議!");
            else{
                System.out.println("IP資料報資料內容已寫入檔案中,檢視後是否需要清除該資料夾?");
                System.out.println("提示:  輸入 ”Yes“:刪除!");
                System.out.println("       輸入 “任意鍵”: 不刪除!");
                String s2 = reader.next();
                String s3 = "Yes";
                if(s2.equals(s3)){
                    try{
                        File file = new File("1.txt");
                        if(file.delete()){
                            System.out.println(file.getName() + " 檔案已被刪除!");
                        }else{
                            System.out.println("檔案刪除失敗!");
                        }
                    }catch(Exception e){
                        e.printStackTrace();
                    }
                }
                else
                    System.out.println("未刪除此資料夾!");
            }
    }
}