我想在TCPPacket或UDPPacket中解析我收到的数据包,但是如果我写“TCPPacket pac3 =(TCPPacket)数据包”;对于使用UDP作为传输层协议的数据包,我得到一个例外 “线程中的异常”主“java.lang.ClassCastException:jpcap.packet.UDPPacket无法强制转换为jpcap.packet.TCPPacket”
如何识别我收到的数据包是使用TCP还是UDP? 实际上我想从收到的数据包中获取端口号。
答案 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_TCP
和jpcap.Packet.IPPROTO_UDP
可能会映射到这些值。所以看起来你最好的办法是解析标题。