如何在使用jpcap的java中识别收到的数据包是使用TCP还是UDP?

时间:2012-02-28 18:27:08

标签: java network-programming jpcap

我想在TCPPacket或UDPPacket中解析我收到的数据包,但是如果我写“TCPPacket pac3 =(TCPPacket)数据包”;对于使用UDP作为传输层协议的数据包,我得到一个例外 “线程中的异常”主“java.lang.ClassCastException:jpcap.packet.UDPPacket无法强制转换为jpcap.packet.TCPPacket”

如何识别我收到的数据包是使用TCP还是UDP? 实际上我想从收到的数据包中获取端口号。

3 个答案:

答案 0 :(得分:1)

您问题的明显答案是使用instanceof运算符:

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

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

答案 1 :(得分:0)

可能是您可以在java中使用instanceof运算符来确定数据包的类型。

答案 2 :(得分:0)

看起来没有基于api的方法可以调用。如果有,它将在数据包的父类which is found here.

通常这种事情会在流中处理,你有一个TCP流或一个UDP流。但遗憾的是你没有。

您应该能够依赖instanceof,但显然instanceof首选api依赖。

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

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

相关问题