JPCAP——Java中的数据链路层控制

JPCAP——Java中的数据链路层控制,第1张

JPCAP——Java中的数据链路层控制,第2张

一、导言。JPCAP

众所周知,JAVA虽然对TCP/UDP传输有很好的定义,但是对于网络层以下的传输却无能为力。JPCAP扩展包弥补了这一点。

实际上,JPCAP并不是数据链路层的真正控制,而是一个中间件。JPCAP调用wincap/libpcap,为JAVA语言提供通用接口,从而实现平台无关性。在官网上,JPCAP支持FreeBSD 3.x、Linux红帽6.1、Fedora Core 4、Solaris、微软Windows 2000/XP。

二。。JPCAP机制

JP的整体结构类似于wincap/libpcap,比如NetworkInterface类对应wincap的typedef struct _ADAPTERADAPTER,getDeviceList()对应Jpcap_findalldevs()等等。JP有16个班。这里有四个最重要的。

1.网络接口

这个类的每个实例代表一个网络设备,通常是网卡。这个类只有一些数据成员,除了从java.lang.Object继承的基本方法之外,没有定义其他方法


数据成员

网络接口地址[]

Java . lang . string
datalink _ description。
数据链路层的描述。描述局域网。例如以太网、无线局域网、令牌环网等。

Java . lang . string
datalink _ name
对应于此网络设备的数据链路层的名称。具体比如以太网10M、100M、1000M等。

Java . lang . string
说明
网卡是XXXX牌XXXX型号之类的。比如我的网卡描述:Realtek RTL8169/8110家族千兆以太网NIC

Boolean
loopback
表示该设备是否为环回设备。

byte[]
MAC _ address
网卡的MAC地址,6字节。

Java . lang . string
name
该设备的名称。比如我的网卡名称:\ device \ NPF _ { 3c E5 FDA 5-e15d-4f 87-b217-255 bbcb 351 cd5 }

2.JpcapCaptor

这个类提供了一系列静态方法来实现一些基本功能。该类的一个实例表示与指定设备建立链接,通过该链接可以控制设备,如设置网卡模式、设置过滤关键字等。


数据成员

int

丢弃的_数据包

丢弃的数据包数量。

受保护的int

ID

这个数据成员在正式文档中没有解释。查看JPCAP源代码,可以发现这个ID实际上是在其JNI的C代码部分传递的。这个类本身没有定义,所以供内部使用。其实在JpcapCator实例的使用中是没有办法调用这个数据成员的。

protected static boolean[]

instancedflag

同样,公文里也没有说明,估计是内部用的。

protected static int

MAX _ NUMBER _ OF _ INSTANCE

同样,公文里也没有说明,估计是内部用的。

int

Received _ packets
接收的数据包数量

方法

staticnetworkInterface[]

GetDeviceList()
返回网络设备的列表。

staticjpcapcaptor

Open Device(Network Interface Interface,Int Snaplen,Boolean Promisc,Int to _ MS)
创建与指定设备的连接并返回连接。注意,以上两种方法都是静态方法。

接口:打开连接的设备的实例;

Snaplen:这是一个容易混淆的参数。实际上,这个参数不是为了限制可以捕获多少个数据包,而是为了限制每次收到数据包时要提取的第一个字节的数量。

Promisc:设置是否是混杂模式。混杂模式会接收所有的数据包,如果后面调用过滤函数setFilter()就没有效果了;

To_ms:该参数主要用在processPacket()方法中,指定超时时间;

void

Close()
关闭调用此方法的设备的连接,打开相对于openDivece()的连接。

JPCAPSender

GetJpcapSenderinstance()
这个返回JpcapSender的一个实例,JpcapSender类是一个专门控制设备发送数据包功能的类。

Packet

get Packet()
捕获并返回一个数据包。这是JpcapCaptor实例中捕获包的四种方法之一。

int

Loop Packet(int count,PacketReceiver handler)
捕获指定数量的数据包,并将它们传递给实现数据包接收器接口的类的实例,并返回捕获的数据包数量。如果count参数设置为-1,将无限期地捕获数据。

此方法不受超时的影响。还记得openDivice()中的to_ms参数吗?该参数对该方法没有影响。如果没有捕获到指定数量的数据包,此方法将始终阻塞并等待。
在数据包接收器中只有一个抽象方法void receive(数据包p)。

int

process packet(int count,packet receiver handler)
与loopPacket()函数相同,不同的是该方法受超时影响,在指定时间后会自动返回捕获的包数。

int

dispatchPacket(int count,packet receiver handler)
的功能与processPacket()相同,只是该方法可以工作在“非阻塞”模式,在这种模式下dispatch packet()可以

void

set filter(Java . lang . string condition,boolean optimize)
。条件:设置要提取的包的关键字。

Optimize:文档或源代码中没有说明这个参数,但是如果这个参数为true,过滤器将处于优化模式。

void

setNonBlockingMode(booleanonblocking)

如果值为“真”,则设置为“非阻塞”模式。

void

特征环()

在调用processPacket()和loopPacket()之后,再次调用此方法可以强制processPacket()和loopPacket()停止。

3.JpcapSender

这个类专用于控制数据包的发送。


方法成员

void

close()
强制关闭此连接。

staticJpcapSender

openraw socket()

该方法返回的JpcapSender实例会在发送数据包时自动填充数据链路层的头。

void

发送数据包
jpc sender最重要的功能就是发送数据包。注意,如果调用该方法的实例是由JpcapCaptor的getJpcapSenderInstance()获取的,则需要自己设置数据链路层的头,但如果是由上面的openRawSocket()获取的,则不需要设置,数据链路层的头会由系统自动生成。

4.小包

这是所有其他数据包类别的父类别。jp支持的包有:
ARPPacket,DatalinkPacket,EthernetPacket,ICMPPacket,IPPacket,TCPPacket,UDPPacket。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » JPCAP——Java中的数据链路层控制

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情