Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Java (https://forum.zone-game.info/forumdisplay.php?f=126)
-   -   JnetPcap (https://forum.zone-game.info/showthread.php?t=22676)

shocked 05.09.2012 13:57

JnetPcap
 
Привет всем. В общем есть вопрос тем кто имеет опыт работы с данной библиотекой. Есть 2 пакеты с одинаковыми seq/ack номерами но первый приходит с неполными tcp данными
1 packet:
Свернуть ↑Развернуть ↓

2й пакет
2 packet:
Свернуть ↑Развернуть ↓

В packetSamurai следующий код отвечает за такое
 
 public void add(TCPPacket p) {
        for (final SeqHolder sh : _waitingPrevious.values()) {
            final TCPPacket old = sh.getPacket();
            if (sh.getPacket().sequence == p.sequence) {
                if (old.data.length < p.data.length) {
                    final int diff = p.data.length - old.data.length;
                    System.err.printf("DIFF %d = %d - %d \n",diff, p.data.length, old.data.length);
                    final long seq = (old.sequence + old.data.length)%MODULO;
                    //System.err.println("ADJUSTED TO SEQ: "+seq+"\nPACKET: "+p);
                    final byte[] data = new byte[diff];
                    System.arraycopy(p.data, p.data.length - diff, data, 0, data.length);
                    System.err.println(Util.hexDump(p.data));
                    p.data = data;
                    p.sequence = seq;
 
                    System.err.println(Util.hexDump(p.data));
                }
                else if (old.data.length == p.data.length) {
                    // packet retransmitted
                    // dont add, else the data will be duped (acked again)
                    return;
                }
            }
        }
 
Code: Java
И собственно вопрос как с jnetpcap записать в tcp.getPayload() массив ,который выше назван data.
System.arraycopy(...) не помог
Пробовал так
 
 System.arraycopy(data, 0, packet..getHeader(tcp).getPayload(), packet.getHeader(tcp).getPayloadOffset(), data.length);
 
Code: Java

VISTALL 05.09.2012 14:10

Re: JnetPcap
 
я непонял смысл - таких манипуляций, можно обьяснитЬ?

shocked 05.09.2012 14:21

Re: JnetPcap
 
В packetSamurai делается следующее
В old.data хранится следующий массив (неполный) [85 49 03 3A 3E ]. Приходит 2й пакет с такими же seq/ack номерами, только полный [85 49 03 3A 3E F4 36 E5 E5 EA AD FE D0 28 7D 65 53 66 AE F6 5C FE 82 3E B9 9F BC 8F 41 8F 6D 7E]. И в результате он записывает в новый пакет следующее [F4 36 E5 E5 EA AD FE D0 28 7D 65 53 66 AE F6 5C FE 82 3E B9 9F BC 8F 41 8F 6D 7E ], тоесть минус 5 байт предыдущих я хз зачем, но это работает и крипт\логика не падает)).
Ну и мне нада записать такой же массив в поле tcp data я не знаю как. Проще говоря код перевести с jpcap на jnetpcap

VISTALL 05.09.2012 14:26

Re: JnetPcap
 
а по дампу - нормальные данные отображаются?(смотря на код)

shocked 05.09.2012 14:39

Re: JnetPcap
 
Не, старая остается
 
for (final SeqHolder sh : _waitingPrevious.values()) {
            final PcapPacket old = sh.getPacket();
            if (sh.getPacket().getHeader(tcp).seq() == p.getHeader(tcp).seq()) {
                if (old.getHeader(tcp).getPayloadLength() < p.getHeader(tcp).getPayloadLength()) {
                    final int diff = p.getHeader(tcp).getPayloadLength() - old.getHeader(tcp).getPayloadLength();
                    System.err.printf("DIFF %d = %d - %d \n",diff, p.getHeader(tcp).getPayloadLength(), old.getHeader(tcp).getPayloadLength());
                    final long seq = (old.getHeader(tcp).seq() + old.getHeader(tcp).getPayloadLength()) % MODULO;
                    //System.err.println("ADJUSTED TO SEQ: "+seq+"\nPACKET: "+p);
                    final byte[] data = new byte[diff];
                    System.arraycopy(p.getHeader(tcp).getPayload(), p.getHeader(tcp).getPayloadLength() - diff, data, 0, data.length);
 
                    System.out.println("old packet");
                    System.out.println(Util.hexDump(old.getHeader(tcp).getPayload()));
                    System.out.println("new packet");
                    System.out.println(Util.hexDump(p.getHeader(tcp).getPayload()));
                    System.out.println("data array[] for copy");
                    System.out.println(Util.hexDump(data));
                    System.arraycopy(data, 0, p.getHeader(tcp).getPayload(), 0, data.length);
                    System.out.println("after copy");
                    System.out.println(Util.hexDump(p.getHeader(tcp).getPayload()));
 
Code: Java
out:
old packet
85 49 03 3A 3E

new packet
85 49 03 3A 3E F4 36 E5 E5 EA AD FE D0 28 7D 65
53 66 AE F6 5C FE 82 3E B9 9F BC 8F 41 8F 6D 7E

data array[] for copy
F4 36 E5 E5 EA AD FE D0 28 7D 65 53 66 AE F6 5C
FE 82 3E B9 9F BC 8F 41 8F 6D 7E

after copy
85 49 03 3A 3E F4 36 E5 E5 EA AD FE D0 28 7D 65
53 66 AE F6 5C FE 82 3E B9 9F BC 8F 41 8F 6D 7E
Весь гемор из-за одной строчки p.data = data =)

Пока нашел костыльное решение создавать новый JPacket и передавать в конструктор ему строку с нужными байтами, но это ппц неправильно ) хотя работает


Текущее время: 23:48. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot