Я создал приложение, которое извлекает сетевые пакеты, используя этот пример: http://www.codeproject.com/Articles/4217/Packet-Sniffing-with-Winpcap-Functions-Ported-to-a
Я намерен использовать его для получения содержимого конкретных пакетов, отправленных в конкретное приложение с сервера, меня не интересуют какие-либо другие пакеты. Пакет, который мне интересен, - это 1 значение, которое периодически обновляется.
Я преобразовал его в VB.Net, так как это мое предпочтение, поэтому я буду давать свои фрагменты кода в VB, хотя я могу понять С#, поэтому не стесняйтесь приводить примеры с помощью С#.
Он имеет событие с параметром 's', которое содержит содержимое полученного пакета в массиве байтов.
Я преобразовываю этот массив для чтения с помощью двоичного чтения следующим образом:
Dim stream As System.IO.MemoryStream = New System.IO.MemoryStream(s)
Dim reader As New System.IO.BinaryReader(stream)
Dim pos As Long = 0
Dim length As Long = reader.BaseStream.Length
Затем я пройду цикл с переменной "pos" в качестве текущей позиции, увеличивающейся по типу данных текущих байтов. (Например: something = reader.ReadString() pos + = something.Length)
Моя единственная проблема: я не уверен, какие типы я должен искать? Что такое "структура" пакета? Возможно ли получить сервер, на который был отправлен пакет, и приложение, на которое оно было отправлено?
Я никогда не пытался использовать что-то подобное для пакетов раньше, у меня только был опыт получения данных из файла базы данных пользовательского формата.
Редактирование: я нашел что-то более полезное, у которого есть документация, объясняющая IP-адрес источника/получателя, и как фильтровать их, и это выглядит намного более полным, чем вышеупомянутый пример, упомянутый ранее.
http://www.codeproject.com/Articles/12458/SharpPcap-A-Packet-Capture-Framework-for-NET
Хотя он по-прежнему не дает объяснений, как понять содержимое пакета, но возможность фильтрации пакетов - большая помощь.
Существует много разных типов возможных сетевых пакетов - большинство из них хорошо документировано.
То, что вы хотите сделать, это загрузить Wireshark (у Microsoft также есть аналогичный инструмент, чье имя ускользает от меня прямо сейчас), запустите некоторые записи с этим и посмотрите на журналы.
Wireshark распознает практически все существующие сетевые пакеты, поэтому вы можете использовать его журналы, чтобы определить, какой тип пакета вам нужно распознать, а затем Google для его спецификации.
BinaryReader
- это чтение данных, которые были написаны с помощьюBinaryWriter
. Так как здесь это не так: забудьте оBinaryReader
- он вам не поможет.