Как получить пакет HTTP с SharpPcap

Я хотел бы получить все входящие пакеты HTTP своей машины. Чтобы сделать это, я использую SharpPcap, который является оберткой WinPcap.

SharpPcap работает очень хорошо, но он получает пакеты TCP, и это - слишком низкий уровень, чтобы сделать то, что я хочу. Кто-либо знает, как может я easly получать полные запросы/ответы HTTP от всех этих пакетов TCP?

Спасибо

7
задан abatishchev 19 January 2010 в 13:02
поделиться

2 ответа

Декодирование потока TCP в пары HTTP-запроса / ответов нетривиально. Инструменты, такие как Wireshark, делают это со значительными усилиями.

Я написал обертку Wireshark для Ruby (не то, что это поможет вам), но прежде чем я написал, я пытался использовать TSHARK (командная версия Vireshark). Это не решило мою проблему, но это может работать для вас. Вот как:

Вы захватываете пакеты и напишите их в файл PCAP (SharpPCAP, вероятно, имеет способ сделать это). В какой-то момент закройте файл CAP и запустите еще один, затем на старый запускайте TSHARK с фильтром для HTTP Traffic, а флаг, указывающий, что вы хотите вывести в формате PDML. Вы обнаружите, что это формат XML, легко проанализирован с помощью инструментов System.xml, который содержит значение каждого HTTP-поля в различных форматах. Вы можете написать C # код для Spawn TSHARK, и протягивайте его Stdout Stream в чтение XML, чтобы вы получили пакеты из TSHARK, как они появляются. Я не рекомендую использовать парсер DOM, так как вывод PDML для большого файла захвата может очень быстро скинуться.

Если ваши требования не сложны (как мои были), это может быть все, что вам нужно.

2
ответ дан 7 December 2019 в 01:22
поделиться

Существует два пакета ГРУШИ и Zend Рамки v1.10 также будет иметь класс BarCode.

Я не использовал ни один из них, поэтому я не могу рекомендовать его.

-121--3329781-

с использованием теоремы Пифагора (где x1, y1 - точка ребра):

x1 = x + r cos (theta)
y1 = y + r
sin (theta)

в C #, это будет выглядеть следующим образом:

x1 = x + radius * Math.Cos(angle * (Math.PI / 180));
y1 = y + radius * Math.Sin(angle * (Math.PI / 180));

, где все переменные являются двойными и угол в градусах

-121--1506134-

Я думаю, что вы близки к решению: если у вас есть пакеты TCP из трафика HTTP, вы должны извлечь только полезную нагрузку TCP, чтобы перестроить запрос/ответ HTTP. См. эту запись SO о возможном способе ее выполнения.

0
ответ дан 7 December 2019 в 01:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: