UDP包中的Jnetpcap Payload修改
Jnetpcap Payload modify in UDP packet
我会修改从 pcap 文件读取的 UDP 数据包中的数据内容,并将其发送到网络上。
在下面的示例中,我编写了一个字符串 "User data" 并且它可以正常工作,但是如果我的数据需要比之前打开的有效载荷更多的 space ,我会收到错误消息,我如何增加从原始数据中获取的有效载荷数据的维度.pcap 文件?
Pcap pcap_off = Pcap.openOffline(fileName, errorBuf); //open original packet
PcapPacket temp= new PcapPacket(JMemory.Type.POINTER);
pcap_off.nextEx(temp); //only one UDp packet
JBuffer buff=new JBuffer(temp.size());
Ethernet eth=temp.getHeader(new Ethernet());
Ip4 ip=temp.getHeader(new Ip4());
Udp udp=temp.getHeader(new Udp());
Payload data=temp.getHeader(new Payload());
InetAddress dst = InetAddress.getByName("10.0.0.10");
ip.destination(dst.getAddress()); //modify ip dst
ip.checksum(ip.calculateChecksum());
eth.transferTo(buff);
ip.transferTo(buff, 0, ip.size(), eth.size());
*byte[] userdata = new String("User data").getBytes();*
*data.setByteArray(0,userdata);*
*data.transferTo(buff, 0, data.size(), eth.size() + ip.size()+ udp.size());*
int cs = udp.calculateChecksum(); //ricalcolo il checksum UDP
udp.setUShort(6, cs); //correct UDP checksum
udp.transferTo(buff, 0, udp.size(), eth.size() + ip.size());
JPacket new_packet =new JMemoryPacket(JProtocol.ETHERNET_ID,buff); //new packet
非常感谢任何回答。
您无法调整缓冲区大小。您必须分配比原始数据包更大的缓冲区,以便您有扩展空间。
在您的代码中,首先将数据包从 pcap 缓冲区复制到 jbuffer,可能一次复制一个 header 而不是一次复制整个数据包,然后进行更改,一个 header一次。更大的缓冲区将为您提供包含任何大小的有效载荷的空间。
为了在 windows 系统上提高效率,您还可以使用 sendqueue,它允许您在一个大缓冲区中组合许多数据包。
我会修改从 pcap 文件读取的 UDP 数据包中的数据内容,并将其发送到网络上。 在下面的示例中,我编写了一个字符串 "User data" 并且它可以正常工作,但是如果我的数据需要比之前打开的有效载荷更多的 space ,我会收到错误消息,我如何增加从原始数据中获取的有效载荷数据的维度.pcap 文件?
Pcap pcap_off = Pcap.openOffline(fileName, errorBuf); //open original packet
PcapPacket temp= new PcapPacket(JMemory.Type.POINTER);
pcap_off.nextEx(temp); //only one UDp packet
JBuffer buff=new JBuffer(temp.size());
Ethernet eth=temp.getHeader(new Ethernet());
Ip4 ip=temp.getHeader(new Ip4());
Udp udp=temp.getHeader(new Udp());
Payload data=temp.getHeader(new Payload());
InetAddress dst = InetAddress.getByName("10.0.0.10");
ip.destination(dst.getAddress()); //modify ip dst
ip.checksum(ip.calculateChecksum());
eth.transferTo(buff);
ip.transferTo(buff, 0, ip.size(), eth.size());
*byte[] userdata = new String("User data").getBytes();*
*data.setByteArray(0,userdata);*
*data.transferTo(buff, 0, data.size(), eth.size() + ip.size()+ udp.size());*
int cs = udp.calculateChecksum(); //ricalcolo il checksum UDP
udp.setUShort(6, cs); //correct UDP checksum
udp.transferTo(buff, 0, udp.size(), eth.size() + ip.size());
JPacket new_packet =new JMemoryPacket(JProtocol.ETHERNET_ID,buff); //new packet
非常感谢任何回答。
您无法调整缓冲区大小。您必须分配比原始数据包更大的缓冲区,以便您有扩展空间。
在您的代码中,首先将数据包从 pcap 缓冲区复制到 jbuffer,可能一次复制一个 header 而不是一次复制整个数据包,然后进行更改,一个 header一次。更大的缓冲区将为您提供包含任何大小的有效载荷的空间。
为了在 windows 系统上提高效率,您还可以使用 sendqueue,它允许您在一个大缓冲区中组合许多数据包。