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