2009-12-08 6 views
0

pcap_compile() компилирует строку в программу фильтра в виде структуры bpf_program. Теоретически я мог бы сэкономить скомпилированную форму программы и предоставить ее pcap_setfilter() на другом сетевом интерфейсе или даже на другой машине.Насколько переносимым является выход pcap_compile?

Будет ли это работать? Является ли форматы bpf_program переносимыми для разных интерфейсов? Различные процессы? Различные архитектуры? Или безопаснее компилировать выражение каждый раз, когда я хочу его использовать?

Основываясь на существовании pcap_open_dead() Я предполагаю, что он несколько портативен, но то, что безопасно, а что нет, похоже, не указано в документации.

ответ

1

Нет, это не переносится в целом.

Вы можете использовать их на той же машине.

На подобных машинах несколько безопасно. Различные архитектуры? Возможно нет. Может быть, если у них похожие типы. Различные операционные системы? Нет. Я не рекомендую никого из них.

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

+0

Спасибо, это очень полезно. Чтобы уточнить: как насчет разных интерфейсов/устройств на одной машине? – benzado

+1

Различные интерфейсы на одной машине должны быть в порядке, я думаю. Однако я не совсем уверен в всех реализациях. Я на самом деле колеблюсь в отношении разных/видов/интерфейсов, таких как ethernet/loopback/ieee1394. У меня есть подозрение, что это может не сработать, хотя прошло уже больше года с тех пор, как я взломал какой-либо из этих кодов, и все течет из моей головы. – McPherrinM

+0

Различные интерфейсы * с одним и тем же типом заголовка канального уровня * могут запускать один и тот же код BPF. Различные интерфейсы с * разными типами заголовков канального уровня, например. Ethernet против 802.11 по сравнению с PPP, может * НЕ запускать один и тот же код BPF (ну, они могут запускать один и тот же код BPF, но код будет работать некорректно как фильтр на интерфейсах с другим типом заголовка канального уровня из тот, для которого был скомпилирован код БНФ). – 2012-01-23 23:25:46