JnetPcap - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Пользователи Календарь Все разделы прочитаны
Вернуться   Форум администраторов игровых серверов > Полезное / Common > Программирование / Programming > Java

Java В данном форуме вы сможете найти много полезной информации по платформе Java. Подробные статьи, исходные коды и конечно учебники как для новичков так и профессиональных Java разработчиков вы найдёте здесь. Если у вас есть вопрос или хотите поделится своими наработками, пожалуйста, делайте это в этой теме.

Ответ
Опции темы
Непрочитано 05.09.2012, 13:57   #1
Аватар для shocked
Пользователь

Автор темы (Топик Стартер) 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
shocked вне форума Ответить с цитированием
Непрочитано 05.09.2012, 14:10   #2
Аватар для VISTALL
Illussion is real

По умолчанию Re: JnetPcap

я непонял смысл - таких манипуляций, можно обьяснитЬ?
__________________
consulo.io - Consulo - multi-language IDE
VISTALL вне форума Ответить с цитированием
Непрочитано 05.09.2012, 14:21   #3
Аватар для shocked
Пользователь

Автор темы (Топик Стартер) 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
shocked вне форума Ответить с цитированием
Непрочитано 05.09.2012, 14:26   #4
Аватар для VISTALL
Illussion is real

По умолчанию Re: JnetPcap

а по дампу - нормальные данные отображаются?(смотря на код)
__________________
consulo.io - Consulo - multi-language IDE
VISTALL вне форума Ответить с цитированием
Непрочитано 05.09.2012, 14:39   #5
Аватар для shocked
Пользователь

Автор темы (Топик Стартер) 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 и передавать в конструктор ему строку с нужными байтами, но это ппц неправильно ) хотя работает

Последний раз редактировалось shocked; 05.09.2012 в 16:37. Причина: +
shocked вне форума Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 01:53. Часовой пояс GMT +3.

Вверх