我想在TCPPack或UDPPacket中解析我收到的数据包,但如果我为使用UDP作为传输层协议的数据包写"TCPPack pac3=(TCPPack)数据包;",则我会得到一个异常线程"main"java.lang.ClassCastException中的异常:jpcap.packet.UDPPack无法转换为jpcap.packet.TCPPack"
如何识别接收到的数据包是使用TCP还是UDP?实际上,我想从收到的数据包中获取端口号。
问题的明显答案是使用instanceof
运算符:
if (packet instanceof TCPPacket) {
TCPPacket pac3 = (TCPPacket)packet;
// ...
}
但那有点臭。我不知道JPCAP API,但我想看看是否有任何API调用可以询问数据包的类型。或者,您可以设置两种不同的机制(通道、套接字、回调??)来分别接收UDP和TCP,这样您就知道区别了吗?
您可以在java中使用instanceof运算符来确定数据包的类型。
看起来没有可以调用的基于api的方法。如果有,它将在数据包的父类上,可以在这里找到。
通常,这类事情会在流中处理,其中有TCP流或UDP流。但不幸的是你没有。
您应该能够依赖instanceof
,但显然api依赖比instanceof
更可取。
另一种选择是使用header()
方法。协议似乎存储在IP标头中,您应该可以访问该标头。此页面显示IP标头,其中6将是TCP的协议号,17是UDP。
事实上,常数jpcap.Packet.IPPROTO_TCP
和jpcap.Packet.IPPROTO_UDP
可能映射到这些值。因此,您最好的选择是解析标头。