Java低层网络编程.docx
《Java低层网络编程.docx》由会员分享,可在线阅读,更多相关《Java低层网络编程.docx(18页珍藏版)》请在冰豆网上搜索。
Java低层网络编程
第二章Java低层网络编程
一、JPCAP简介
众所周知,JAVA语言虽然在TCP/UDP传输方面给予了良好的定义,提供了充分的类库.但对于网络层以下的控制,却是无能为力的。
JPCAP扩展包正好弥补了这一点。
JPCAP实际上并非一个真正去实现对数据链路层的控制,而是一个中间件,JPCAP调用wincap/libpcap,而给JAVA语言提供一个公共的接口,从而实现了平台无关性。
在官方网站上声明,JPCAP支持FreeBSD3.x,LinuxRedHat6.1,FedoraCore4,Solaris,andMicrosoftWindows2000/XP等系统。
二、JPCAP机制
JPCAP的整个结构大体上跟wincap/libpcap是很相像的,例如NetworkInterface类对应wincap的typedefstruct_ADAPTERADAPTER,getDeviceList()对应pcap_findalldevs()等等。
JPCAP有16个类,下面就其中最重要的4个类做说明。
2.1NetworkInterface
该类的每一个实例代表一个网络设备,一般就是网卡。
这个类只有一些数据成员,除了继承自java.lang.Object的基本方法以外,没有定义其它方法。
数据成员
NetworkInterfaceAddress[]
java.lang.Stringdatalink_description.
数据链路层的描述。
描述所在的局域网是什么网。
例如,以太网(Ethernet)、无线LAN网(wirelessLAN)、令牌环网(tokenring)等等。
java.lang.Stringdatalink_name
该网络设备所对应数据链路层的名称。
具体来说,例如Ethernet10M、100M、1000M等等。
java.lang.Stringdescription
网卡是XXXX牌子XXXX型号之类的描述。
例如网卡描述:
RealtekRTL8169/8110FamilyGigabitEthernetNICBooleanLoopback标志这个设备是否loopback设备。
byte[]mac_address,网卡的MAC地址,6个字节。
java.lang.StringName,这个设备的名称。
例如网卡名称:
\Device\NPF_{3CE5FDA5-E15D-4F87-B217-255BCB351CD5}
2.2JpcapCaptor
该类提供了一系列静态方法实现一些基本的功能。
该类一个实例代表建立了一个与指定设备的链接,可以通过该类的实例来控制设备,例如设定网卡模式、设定过滤关键字等等。
数据成员
intdropped_packets
抛弃的包的数目。
protectedintID
这个数据成员在官方文档中并没有做任何说明,查看JPCAP源代码可以发现这个ID实际上在其JNI的C代码部分传进来的,这类本身并没有做出定义,所以是供其内部使用的。
实际上在对JpcapCator实例的使用中也没有办法调用此数据成员。
protectedstaticboolean[]instanciatedFlag
同样在官方文档中没有做任何说明,估计其为供内部使用。
protectedstaticintMAX_NUMBER_OF_INSTANCE
同样在官方文档中没有做任何说明,估计其为供内部使用。
intreceived_packets
收到的包的数目
方法成员
staticNetworkInterface[]getDeviceList()
返回一个网络设备列表。
staticJpcapCaptoropenDevice(NetworkInterfaceinterface,intsnaplen,booleanpromisc,intto_ms)
创建一个与指定设备的连接并返回该连接。
注意,以上两个方法都是静态方法。
Interface:
要打开连接的设备的实例;
Snaplen:
这个是比较容易搞混的一个参数。
其实这个参数不是限制只能捕捉多少数据包,而是限制每一次收到一个数据包,只提取该数据包中前多少字节;
Promisc:
设置是否混杂模式。
处于混杂模式将接收所有数据包,若之后又调用了包过滤函数setFilter()将不起任何作用;
To_ms:
这个参数主要用于processPacket()方法,指定超时的时间;
voidClose()
关闭调用该方法的设备的连接,相对于openDivece()打开连接。
JpcapSendergetJpcapSenderInstance()
该返回一个JpcapSender实例,JpcapSender类是专门用于控制设备的发送数据包的功能的类。
PacketgetPacket()
捕捉并返回一个数据包。
这是JpcapCaptor实例中四种捕捉包的方法之一。
intloopPacket(intcount,PacketReceiverhandler)
捕捉指定数目的数据包,并交由实现了PacketReceiver接口的类的实例处理,并返回捕捉到的数据包数目。
如果count参数设为-1,那么无限循环地捕捉数据。
这个方法不受超时的影响。
还记得openDivice()中的to_ms参数么?
那个参数对这个方法没有影响,如果没有捕捉到指定数目数据包,那么这个方法将一直阻塞等待。
PacketReceiver中只有一个抽象方法voidreceive(Packetp)。
intprocessPacket(intcount,PacketReceiverhandler)
跟loopPacket()功能一样,唯一的区别是这个方法受超时的影响,超过指定时间自动返回捕捉到数据包的数目。
intdispatchPacket(intcount,PacketReceiverhandler)
跟processPacket()功能一样,区别是这个方法可以处于“non-blocking”模式工作,在这种模式下dispatchPacket()可能立即返回,即使没有捕捉到任何数据包。
voidsetFilter(java.lang.Stringcondition,Booleanoptimize)
condition:
设定要提取的包的关键字。
Optimize:
这个参数在说明文档以及源代码中都没有说明,只是说这个参数如果为真,那么过滤器将处于优化模式。
voidsetNonBlockingMode(Booleannonblocking)
如果值为“true”,那么设定为“non-blocking”模式。
voidbreakLoop()
当调用processPacket()和loopPacket()后,再调用这个方法可以强制让processPacket()和loopPacket()停止。
2.3JpcapSender
该类专门用于控制数据包的发送。
方法成员:
voidclose()
强制关闭这个连接。
staticJpcapSenderopenRawSocket()
这个方法返回的JpcapSender实例发送数据包时将自动填写数据链路层头部分。
voidsendPacket(Packetpacket)
JpcapSender最重要的功能,发送数据包。
需要注意的是,如果调用这个方法的实例是由JpcapCaptor的getJpcapSenderInstance()得到的话,需要自己设定数据链路层的头,而如果是由上面的openRawSocket()得到的话,那么无需也不能设置,数据链路层的头部将由系统自动生成。
2.4Packet
这个是所有其它数据包类的父类。
Jpcap所支持的数据包有:
ARPPacket、DatalinkPacket、EthernetPacket、ICMPPacket、IPPacket、TCPPacket、UDPPacket
这个包的基本属性有:
int
caplen
捕获的长度
byte[]
data
包数据的字节数组(excludingtheheader)
DatalinkPacket
datalink
数据链路层头部
static Packet
EOF
当读一个离线文件读到文件结束标志EOF时
JpcapCaptor.getPacket()返回包.
byte[]
header
头数据的字节数组
int
len
这包的长度
long
sec
捕获时戳(秒)
long
usec
捕获时戳(微秒)
实训一Jpcap运行环境的建立
一、准备工作
首先从相关网站下载三个软件:
1、jdk-6u17-windows-i586.exe
2、WinPcap_4_1_1.zip
3、JpcapSetup-0.6.exe
二、安装配置环境软件
2.1安装配置Java运行环境
运行jdk-6u17-windows-i586.exe程序,安装Java的JDK开发环境,按提示选择安装路经,如E:
\jdk1.6目录下,安装后,有下列若干子目录:
bin——java的执行文件及动态链接库;
demo——java插件;
include——C,C++的一些相关头文件;
jre——一些.DLL及.jar的文件;
lib——java库文件;
sample——一些java程序样例;
配置环境变量:
要让java程序能正确的编译与运行,必须建立或配置三个系统环境变量:
1、建立java主目录环境变量JAVA_HOME,其值为java的jdk安装路经;
如:
变量:
JAVA_HOME值:
E:
\jdk1.6
2、对系统变量path,增加第一条路经,如:
E:
\jdk1.6\bin
在这个路经下有java的执行文件及动态链接库。
增加第二条路经,如:
E:
\jdk1.6\lib
在这个路经下有java的库文件。
3、没有即建立,有则编辑系统变量CLASSPATH,指明类库的路经.
如:
变量:
CLASSPATH值:
.;E:
\jdk1.6\lib
.园点表示当前目录,这是一条路经;
E:
\jdk1.6\lib接着指明java安装路经下的lib路经.
路经之间用分号;分隔,最后路经不必有分号.
配置环境变量具体操作步骤如下:
按次序阅读图2-1,图2-2,图2-3,图2-4,图2-5,图2-6。
表达了在WindowsXP下配置操作。
图2-1右击“我的电脑”选属性图2-2选”高级”标签中的”环境变量”按扭
图2-3新建环境变量JAVA_HOME图2-4变量值为E:
\jdk1.6
图2-5新建CLASSPATH变量图2-6编辑path变量
变量值为.;E:
\jdk1.6\lib添加路径E:
\jdk1.6\bin;E:
\jdk1.6\lib
完成上述配置后,即进DOS界面。
点击”开始”→“程序”→“附件”→“命令提示符”→打开DOS界面。
输入javac回车,即显示如图2-7,表明jdk运行正常。
图2-7DOS界面
2.2安装WinPcap支撑软件
将WinPcap_4_1_1.zip解压生成WinPcap_4_1_1文件夹。
在文件夹中有WinPcap_4_1_1安装器。
双击它,即完成安装。
如图2-8。
图2-8WinPcap_4_1_1安装界面
图2-9WinPcap_4_1_1安装响导
图2-10WinPcap_4_1_1版本协议
图2-11WinPcap_4_1_1安装选项
图2-12WinPcap_4_1_1安装完成
图2-13WinPcap_4_1_1安装结果
其中rpcapd(RemotePacketCaptureDaemon)远程包捕获守护程序。
2.3安装Jpcap支撑软件
双击运行JpcapSetup-0.6.exe程序。
自动安装Jpcap。
图2-14Jpcap安装响导
图1-15Jpcap版本协议
图2-16选择Jpcap安装组件
图2-17Jpcap安装成功
图2-18Jpcap安装完成
安装后,有下列文件:
(1)E:
\jdk1.6\jre\lib\ext有jpcap.jar文件;
(2)E:
\jdk1.6\bin有Jpcap.dll文件。
图2-19jpcap.jar文件
图2-20