Всем привет.
У меня наверное достаточно простой вопрос по сетевым пакетам, но найти решение не получилось.
Поставлена задача: модифицировать имеющийся сниффер для выгрузки данных в формат, поддерживаемый wireshark'ом (я склоняюсь в сторону формата tcpdump).
Сниффер использует библиотеку libpcap для сбора данных. Реализация примитивна:
ph = pcap_open_live('eth0', 65535, 1, 0, errbuf);
while (1) {
data = pcap_next(ph, info);
// process packet (info, data)
}
Но здесь есть проблема. data указывает на начало Ethernet пакета. Структура Ethernet пакета достаточно проста: маки источника и получателя, протокол, данные, никаких меток начала нового заголовка пакета. Поэтому если просто выгружать в файл данные из data, то непонятно как отделять окончание одного пакета и начало другого (в моем примере snaplen = 65535, но на самом деле используются меньшие значения, что приводит к обрезанию пакетов, т.е. использовать длины пакетов в заголовках - не вариант). Само собой, Wireshark некорректно обрабатывает dump файл, сформированный таким образом.
Можно заставить libpcap сформировать нормальный dump файл его же средствами.
pcap_loop(ph, 100, pcap_dump_open(ph, "wireshark.dump"));
Собственно, вопрос. Что необходимо вставлять между Ethernet пакетами? Или как иначе можно вручную сгенерировать dump файл для Wireshark, используя libpcap?