Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.08.2014, 13:25   #1
Dr.Pauliss
Пользователь
 
Регистрация: 26.05.2011
Сообщений: 22
Вопрос Как расшифровать UDP пакет

Здравствуйте.

Средствами C# получаю UDP пакет... Пытаюсь прочитать его методом:
Код:
string stringData = Encoding.UTF8.GetString(data, 0, recv); // в итоге смайлик выводит
Но как я нагуглил - это не правильно, применительно к структурированному пакету.

Содержание пакета отображено (через сторонний сниффер вскрыл его) на картинке в области под номером 1.




Хотел поинтересоваться, как мне прочитать-распарсить этот пакет ? Например получить значение выделенное синим в области 1 ?

P.S:
a) На скриншоте: под номером 3 программа, которая также получает эти пакеты и предстваляет их в читабельном виде.

С Уважением Павел...
Изображения
Тип файла: jpg udpUb.jpg (64.3 Кб, 207 просмотров)
Dr.Pauliss вне форума Ответить с цитированием
Старый 19.08.2014, 13:57   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А структура пакета тебе известна?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.08.2014, 15:07   #3
Dr.Pauliss
Пользователь
 
Регистрация: 26.05.2011
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А структура пакета тебе известна?
Я ранее нашёл исходник скрипта на питоне:
https://gist.github.com/trhura/5998584

Написано, что он действует аналогично программе изображенной под номером 3 на скриншоте.

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

С Уважением Павел...
Dr.Pauliss вне форума Ответить с цитированием
Старый 19.08.2014, 15:27   #4
MODBUS
Пользователь
 
Регистрация: 01.08.2014
Сообщений: 66
По умолчанию

...накапливайте буфер, парсите на предмет набора нужной последовательности байт. Если есть возможность отловить начало пакета для синхронизации, еще лучше, тогда можно плавающим окном бегать по набору.
MODBUS вне форума Ответить с цитированием
Старый 19.08.2014, 16:27   #5
Dr.Pauliss
Пользователь
 
Регистрация: 26.05.2011
Сообщений: 22
По умолчанию

Цитата:
Сообщение от MODBUS Посмотреть сообщение
...накапливайте буфер, парсите на предмет набора нужной последовательности байт. Если есть возможность отловить начало пакета для синхронизации, еще лучше, тогда можно плавающим окном бегать по набору.
Спасибо за ответ...

Я просто не знаю с какой стороны подойти. Вот, например, у меня есть принятый пакет в nReceived тип int. Можно как-нибудь конвертировать его полностью в читабельный (получитабельный) текст ?

Например, на скриншоте, под цифрой 2 - вывод с закладки Data, результат работы сниффера. Т.е снифер как-то вывел (может быть, как часть UDP пакета) эту строку...

С Благодарностью Павел...
Dr.Pauliss вне форума Ответить с цитированием
Старый 19.08.2014, 16:57   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Dr.Pauliss Посмотреть сообщение
Спасибо за ответ...

Я просто не знаю с какой стороны подойти. Вот, например, у меня есть принятый пакет в nReceived тип int. Можно как-нибудь конвертировать его полностью в читабельный (получитабельный) текст ?

Например, на скриншоте, под цифрой 2 - вывод с закладки Data, результат работы сниффера. Т.е снифер как-то вывел (может быть, как часть UDP пакета) эту строку...

С Благодарностью Павел...
ну он отбросил IP-заголовок, и просто конвертнул каждый байт в текст(это через класс Encoding)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.08.2014, 14:12   #7
Dr.Pauliss
Пользователь
 
Регистрация: 26.05.2011
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
ну он отбросил IP-заголовок, и просто конвертнул каждый байт в текст(это через класс Encoding)
Хмм.. а подробнее не подскажете, как конвертнуть ?

Я пробовал
Код:
string result = Encoding.UTF8.GetString(byteData); //также пробовал кодировки ASCII, Default
В итоге result содержал один символ (по памяти - то "F", то "E", то смайлик).

Единственное, с помошью
Код:
string result = BitConverter.ToString(byteData);
удалось получить нечто похожее (область 1), как у сниффера (область 2).


Также пытался конвертировать отдельные байты (средствами
Код:
result += byteData[i].ToString("x02")
, например с 6 по 12) - результат: какой то набор символов, например вида 6f6v65f4d5..

Эксперементировал, гуглил - не могу понять... Может быть есть статья, где расписано просто и доходчиво об этом ?

С Уважением Павел...
Dr.Pauliss вне форума Ответить с цитированием
Старый 30.08.2014, 13:08   #8
Dr.Pauliss
Пользователь
 
Регистрация: 26.05.2011
Сообщений: 22
По умолчанию Решение

Здравствуйте,

В итоге мне удалось получить нужную информацию из UDP пакета.
Насколько я могу судить по результату - нужная информация расположена между сигнальными байтами.

Думаю об этом мне и советовали выше (про структуру и набор нужной последовательности байт). Просто я не полностью понимал о чём речь. (не сталкивался ранее с подобным).

Подумал над советами форума, повникал в исходники скрипта на питоне (https://gist.github.com/trhura/5998584), проинспектировал вывод сниффера (на картинке выше область 1). И в итоге пришел к выводу (далее по картинке, область 1), что, например, информация о типе устройства (значение выделенное синим в области 1) - "TSW-PoE", размещается в байтах UDP пакета всегда после трёх байтов 0С 00 07. При этом (опираясь на иформацию полученную из исходников скрипта на питоне) я выяснил, что:
два байта 0С 00 - это флаг начала строки с типом устройства,
один байт 07 - это длина строки (тип устройства) в байтах.

В итоге, для получения строки с типом устройства ("TSW-PoE") из байт UDP пакета был рождён нижеследующий код:
Код:
// Searching of index for start position and read the "deviceType" by 
// target pattern of search: [0C 00 +1 byte <DATA>];
// (0C=12 int; 00=0 int; +1byte=is byte-value that contain length of target string
for(int bn=0; bn< udpPacket.Bytes.Length; bn++)
    if(udpPacket.Bytes[bn] == 12 && udpPacket.Bytes[bn+1] == 0)
    {								
        string deviceType = Encoding.ASCII.GetString(udpPacket.Bytes, bn + 3, udpPacket.Bytes[bn+2]);
																
    } // deviceType
Кстати, я использовал библиотеку SharpPcap. Это позволило мне извлекать из всего полученного пакета только UDP кадр и работать непосредственно с ним.

Возможно я что-то упустил (или где-то ошибся) по неграмотности, но в целом буду рад, если этот пост сэкономит кому-нибудь время гугления.

С Благодарностью Павел...
Dr.Pauliss вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не доходит UDP пакет Loginef Помощь студентам 9 12.07.2013 13:15
Как отправить UDP пакет Larboss Работа с сетью в Delphi 0 20.10.2011 21:30
Скопировать и послать udp-пакет Riply Работа с сетью в Delphi 8 17.02.2011 15:51
UDP клиент-сервер. Пакет neon2k Общие вопросы .NET 1 27.06.2010 11:53
расшифровать в ASCII потом цифры расшифровать в бинарный код viorel Общие вопросы Delphi 1 07.05.2010 14:43