1) Код вызывает исключение, поскольку классы-оболочки работают только с использованием ранее выделенных буферов, поскольку основная цель библиотеки - анализ буферов захваченных пакетов.Поэтому перед их использованием необходимо выделить буфер.
2) Пакеты должны быть собраны с предоставлением всех необходимых байтов.Но код можно записать так, чтобы действительно было необходимо всего несколько байтов (см. Выше).
3) sendPacket
ожидает целый пакет, полный кадр Ethernet.Таким образом, заголовки Ethernet, IP, TCP и полезная нагрузка должны быть записаны в буфер.
4) Основная идея, позволяющая использовать классы-оболочки, состоит в том, чтобы выделить буфер и затемоставив библиотеку, отсканируйте ее, чтобы обнаружить заголовки, но необходимо предоставить минимум информации (байты).
JMemoryPacket packet = new JMemoryPacket(packetSize);
packet.order(ByteOrder.BIG_ENDIAN);
Фрейм Ethernet требуется тип протокола (0x0800) в позиции 12:
packet.setUShort(12, 0x0800);
packet.scan(JProtocol.ETHERNET_ID);
После scan
можно получить экземпляр Ethernet и использовать сеттеры :
Ethernet ethernet = packet.getHeader( new Ethernet() );
ethernet.destination(...);
...
заголовок IP4 требуется версия (0x04) и размер (0x05) в позиции 14:
packet.setUByte(14, 0x40 | 0x05);
packet.scan(JProtocol.ETHERNET_ID);
Ip4 ip4 = packet.getHeader( new Ip4() );
ip4.type(0x06); //TCP
ip4.length( packetSize - ethernet.size() );
ip4.ttl(...);
...
заголовок TCP необходим размер (0x50):
packet.setUByte(46, 0x50);
packet.scan(JProtocol.ETHERNET_ID);
Tcp tcp = packet.getHeader( new Tcp() );
tcp.seq(...);
...
Итак, полезная нагрузка:
Payload payload = packet.getHeader( new Payload() );
payload.set...(...);
...
И, наконец:
pcap.sendPacket( ByteBuffer.wrap( packet.getByteArray(0, packet.size() ) );
5) За один раз можно записать все необходимые байты, чтобы избежать стольких вызовов метода сканирования.