1

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

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

4

3 回答 3

1

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

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

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

于 2012-02-28T18:31:41.907 回答
0

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

于 2012-02-28T18:32:43.060 回答
0

看起来没有可以调用的基于 api 的方法。如果有,它将位于数据包的父类上,可在此处找到。

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

你应该可以依赖instanceof,但显然api依赖是首选instanceof

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

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

于 2012-02-28T18:32:59.383 回答