1

コンピューターの総データ使用量を測定できるプログラムの次のコードを作成しました。クラス PcapPacket のメソッド getTotalSize() を使用しました。データ使用量を直接示しているか (継続的に追加されている場合)、または他の方法を使用する必要があります。

import org.jnetpcap.packet.PcapPacket; 
import org.jnetpcap.protocol.JProtocol; 

public class CapturePacket{

public static void main(String[] args) throws Exception {
    List<PcapIf> alldevs = new ArrayList<PcapIf>(); // Will be filled with
    // NICs
    StringBuilder errbuf = new StringBuilder(); // For any error msgs


    int r = Pcap.findAllDevs(alldevs, errbuf);
    if (r == Pcap.NOT_OK || alldevs.isEmpty()) {
        System.err.printf("Can't read list of devices, error is %s", errbuf
                .toString());
        return;
    }
    PcapIf device = (PcapIf) alldevs.get(0); // We know we have at least 1 device


    String ad = device.getHardwareAddress().toString();
    System.out.println("\nCurrently open adapter MAC:" + ad);

    int snaplen = 64 * 1024; // Capture all packets, no truncation
    int flags = Pcap.MODE_PROMISCUOUS; // capture all packets
    int timeout = 10; //10*1000; // No timeout, non-interactive traffic
    final Pcap pcap = Pcap.openLive(device.getName(), snaplen, flags, timeout,
            errbuf);
    if (pcap == null) {
        System.err.printf("Error while opening device for capture: "
                + errbuf.toString());
        return;
    }


    PcapPacketHandler<String> jpacketHandler = new PcapPacketHandler<String>() 
     {
         long total_traffic = 0,count = 0;
         int i;


     public void nextPacket(PcapPacket packet, String user) {

         count += packet.getTotalSize();
         if( count>1048576 )
            {
                i++;
                total_traffic += count;
             System.out.println(i+"MB"+"\t total:"+total_traffic);
             count=count-1048576;

            }
     };
     };           
            pcap.loop(-1,jpacketHandler," ");  
            pcap.close(); 
            }

}

上記は、ネットワークを通過するトラフィックをカウントするために私が書いたコードです。コンピューターのデータ使用量を (完全に正確ではないにしても) 直接示していますか?

4

1 に答える 1

0

packet.getPacketWirelen() を使用する必要があります ドキュメントによると、キャプチャされたパケットが切り捨てられた場合でも、ワイヤ上で見られる元の長さを取得します。

さらに、パケットが内部ネットワークからのみ送信されているかどうかを確認する必要があるため、データ使用量にはカウントされません (ISP から見たデータ使用量が必要であると想定しています)。

その後、データ使用量を示す必要があります。

于 2013-09-30T16:46:17.040 に答える