0

我会修改从 pcap 文件读取的 UDP 数据包中的数据内容并将其发送到网络上。在下面的示例中,我编写了一个字符串“用户数据”并且它可以正常工作,但是如果我的数据需要比之前打开的有效负载更多的空间,我会得到错误,我如何增加从原始 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 

非常感谢任何答案。

4

1 回答 1

0

您无法调整缓冲区的大小。您必须分配比原始数据包更大的缓冲区,以便您有扩展空间。

在您的代码中,首先将数据包从 pcap 缓冲区复制到 jbuffer,可能一次复制一个标头,而不是一次复制整个数据包,然后进行更改,一次一个标头。更大的缓冲区将为您提供包含任何大小的有效负载的空间。

为了在 Windows 系统上提高效率,您还可以使用 sendqueue,它允许您在单个大缓冲区中组合许多数据包。

于 2015-01-11T14:00:20.977 回答