繁体   English   中英

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

[英]How to identify whether a received packet is using TCP or UDP, in java using jpcap?

我想在TCPPacket或UDPPacket中解析我收到的数据包,但是如果我写“ TCPPacket pac3 =(TCPPacket)数据包;” 对于使用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_TCPjpcap.Packet.IPPROTO_UDP可能映射到这些值。 因此,看起来最好的选择是解析标头。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM