在使用jpcap的java中,如何识别接收到的数据包是使用TCP还是UDP?
我想在TCPPacket或UDPPacket中解析接收到的数据包,但如果我为使用UDP作为传输层协议的数据包写入“TCPPacket pac3=(TCPPacket)packet;”,则会得到一个异常 线程“main”java.lang.ClassCastException中的异常:无法将jpcap.packet.UDPPacket转换为jpcap.packet.TCPPacket 如何识别接收到的数据包是使用TCP还是UDP?在使用jpcap的java中,如何识别接收到的数据包是使用TCP还是UDP?,java,network-programming,jpcap,Java,Network Programming,Jpcap,我想在TCPPacket或UDPPacket中解析接收到的数据包,但如果我为使用UDP作为传输层协议的数据包写入“TCPPacket pac3=(TCPPacket)packet;”,则会得到一个异常 线程“main”java.lang.ClassCastException中的异常:无法将jpcap.packet.UDPPacket转换为jpcap.packet.TCPPacket 如何识别接收到的数据包是使用TCP还是UDP? 实际上,我想从收到的数据包中获取端口号。您的问题的明显答案是使用i
实际上,我想从收到的数据包中获取端口号。您的问题的明显答案是使用
instanceof
操作符:
if (packet instanceof TCPPacket) {
TCPPacket pac3 = (TCPPacket)packet;
// ...
}
但那有点臭。我不知道JPCAPAPI,但我想看看是否有任何API调用可以询问数据包的类型。或者,您可以设置两种不同的机制(通道、套接字、回调???)来分别接收UDP和TCP,以便了解两者的区别?您的问题的明显答案是使用
instanceof
操作符:
if (packet instanceof TCPPacket) {
TCPPacket pac3 = (TCPPacket)packet;
// ...
}
但那有点臭。我不知道JPCAPAPI,但我想看看是否有任何API调用可以询问数据包的类型。或者,您可以设置两种不同的机制(通道、套接字、回调???)来分别接收UDP和TCP,以便了解两者的区别?可能是您可以使用java中的instanceof运算符来确定数据包的类型 可能您可以在java中使用instanceof运算符来确定数据包的类型 看起来没有基于api的方法可以调用。如果有,它将位于数据包的父类上 通常,这类事情将在流中处理,其中您有一个TCP流或一个UDP流。但不幸的是你没有 您应该能够依赖于
instanceof
,但显然,api依赖性优于instanceof
另一个选项是使用header()
方法。协议似乎存储在IP报头中,您应该可以访问该报头。似乎说明了IP头,6是TCP的协议号,17是UDP
事实上,常量
jpcap.Packet.IPPROTO_TCP
和jpcap.Packet.IPPROTO_UDP
可能映射到这些值。因此,您的最佳选择似乎是解析标头。似乎没有基于api的方法可以调用。如果有,它将位于数据包的父类上
通常,这类事情将在流中处理,其中您有一个TCP流或一个UDP流。但不幸的是你没有
您应该能够依赖于instanceof
,但显然,api依赖性优于instanceof
另一个选项是使用header()
方法。协议似乎存储在IP报头中,您应该可以访问该报头。似乎说明了IP头,6是TCP的协议号,17是UDP
事实上,常量
jpcap.Packet.IPPROTO_TCP
和jpcap.Packet.IPPROTO_UDP
可能映射到这些值。因此,您的最佳选择似乎是解析标头。接下来,由于您正在TCP和UDP中查找端口,标头的前16位(不是IP标头,而是TCP/UDP标头)是源端口,接下来的16位是目标端口。您应该能够在不考虑是TCP还是UDP的情况下使用它。接下来,因为您正在TCP和UDP中查找端口,所以头的前16位(不是IP头,而是TCP/UDP头)是源端口,接下来的16位是目标端口。您应该能够使用它,而不必关心它是TCP还是UDP。