2012-02-28 62 views
1

我想分析的TCPPacket或UDPPacket我接收的数据包,但如果我写“TCPPacket PAC3 =(TCPPacket)数据包;”对于使用UDP作为传输层协议的数据包,然后我得到一个异常 “异常在线程‘主要’java.lang.ClassCastException:jpcap.packet.UDPPacket不能转换到jpcap.packet.TCPPacket”如何在java中使用jpcap来识别接收的数据包是使用TCP还是UDP?

如何我可以确定收到的数据包是使用TCP还是UDP? 其实我想从接收到的数据包中获取端口号。

+0

跟进,因为你正在寻找的端口,在TCP和UDP,标题的前16位(而不是IP头,但TCP/UDP报头)是源端口和下一目标端口是16位。你应该可以使用它,而不必关心它是TCP还是UDP。 – corsiKa 2012-07-25 15:00:45

回答

1

答案很明显,你的问题是使用instanceof操作:

if (packet instanceof TCPPacket) { 
    TCPPacket pac3 = (TCPPacket)packet; 
    // ... 
} 

但是,这是一个有点臭。我不知道JPCAP API,但我会看看是否有任何API调用可以用来询问它的类型。或者,也许你可以设置两种不同的机制(通道,套接字,回调???)分别接收UDP和TCP,这样你就知道它们的区别了吗?

0

可能是你可以使用instanceof运算符在Java中,以确定数据包的类型。

0

它看起来像有没有一种方法,基于API,你可以调用。如果存在,它将位于数据包的父类别上,which is found here.

通常,这种类型的事情将在流中处理,其中您有一个TCP流或一个UDP流。但不幸的是你没有。

您应该可以依靠instanceof,但显然API依赖优于instanceof

另一种选择是使用header()方法。看起来协议存储在你应该有权访问的IP标头中。 This page似乎是为了说明IP头,而这6将是TCP的协议号,其中17是UDP。

事实上,常量jpcap.Packet.IPPROTO_TCPjpcap.Packet.IPPROTO_UDP可能映射到这些值。所以看起来最好的办法是解析头文件。

相关问题