前言
java是跨平台語言一般來說對網絡的操作都在IP層以上也就是只能對tcp/udp進行操作當然也可以設置部分tcp/udp的option如果想再往IP層或者數據link層操作就無能為力了必須依靠jni使用本地OS的socket部分接口很幸運我在知道有winpcap的時候同時也知道有人在開發jpcap此包可以方便的操作網絡底層應用協議以下詳細描述
實施步驟
下載需要的包上可以下到最新的jpcap你只需要把lib中的dll文件拷貝到jre的bin目錄同時lib中的jar文件拷貝到jre中的lib/ext目錄下就安裝完整當然你可以使用exe安裝包進行安裝這樣會更加的簡單
編碼你可以使用任何你喜歡的ide工具但是必須把jpcapjar加到classpath中否則無法編譯通過icmp有很多類型當前僅用echo類型為例也就是我們通過用的ping工具所產生的網絡行為以下為代碼詳細
import InetAddress;
import jpcapJpcapCaptor;
import jpcapJpcapSender;
import jpcapNetworkInterface;
import jpcappacketEthernetPacket;
import jpcappacketICMPPacket;
import jpcappacketIPPacket;
class ICMP
{
public static void main(String[] args) throws javaioIOException{
NetworkInterface[] devices = JpcapCaptorgetDeviceList();
if(argslength<){
Systemoutprintln(Usage: java ICMP <device index (eg )>);
for(int i=;i<deviceslength;i++)
Systemoutprintln(i+:+devices[i]name+(+devices[i]description+));
Systemexit();
}
int index=IntegerparseInt(args[]);
//開啟網絡設備
JpcapCaptor captor=JpcapCaptoropenDevice(devices[index]false);
//設置只過濾 icmp包
captorsetFilter(icmptrue);
JpcapSender sender=captorgetJpcapSenderInstance();
ICMPPacket p=new ICMPPacket();
ptype=ICMPPacketICMP_ECHO;
pseq=(short)x;
pid=(short)x;
psetIPvParameter(falsefalsefalsefalsefalsefalseIPPacketIPPROTO_ICMP
InetAddressgetByName()InetAddressgetByName());
pdata=abcdefghijklmnopqrstuvwabcdehghigetBytes();
EthernetPacket ether=new EthernetPacket();
etherframetype=EthernetPacketETHERTYPE_IP;
//填寫自己和對方的mac地址必須要正確填寫如果有錯誤將無法收到回包
etherdst_mac=new byte[]{(byte)x(byte)x(byte)xd(byte)x(byte)xd(byte)x};
ethersrc_mac=new byte[]{(byte)x(byte)x(byte)x(byte)xad(byte)xc(byte)x};
pdatalink=ether;
sendersendPacket(p);
Systemoutprintln(send);
ICMPPacket rp= null;
while(true){
rp=(ICMPPacket)captorgetPacket();
if(rp==null){
throw new IllegalArgumentException(no rcv icmp echo reply);
}else
{
Systemoutprintln(rcv icmp echo reply);
return ;
}
}
}
}
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25573.html