Поиск строки в пакете - PullRequest
2 голосов
/ 28 июля 2010

Предположим, мы перехватываем пакеты с помощью C API libpcap. Эффективно ли анализировать некоторые строки полезной нагрузки с помощью поиска строки strstr () по скорости линии (например, Мбит / с / Гбит / с)? Например, strstr (полезная нагрузка, «Пользователь-агент»);

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

Если мы хотим сделать это только для аргументов заголовка HTTP, есть ли C API? Мне не ясно, может ли libcurl сделать это ... заранее спасибо.

Ответы [ 3 ]

1 голос
/ 26 августа 2010

http://www.arstdesign.com/articles/fastsearch.html имеет некоторые показатели, показывающие, что strstr является прилично производительным.Для коротких совпадений строк я сомневаюсь, что библиотека регулярных выражений может побить хорошую оптимизированную сборку.

1 голос
/ 02 сентября 2010

Если вы ищете только одну короткую строку, то ничто не будет намного быстрее, чем линейное сравнение, используемое strstr().Тем не менее, strstr() особая обработка NUL байтов почти наверняка не то, что вы хотите для изучения сетевого трафика, и вам лучше написать свою собственную реализацию, которая обрабатывает все байты одинаковыми и приемлемыми параметрами длины.*

Если вы ищете несколько строк, вам лучше использовать быстрый алгоритм сопоставления строк, такой как Aho-Corasick, или создать конечный автомат, который соответствует строкам, которые вы хотите, в нужном контексте, то есть парсере,Для синтаксического анализа в основном регулярной грамматики, такой как HTTP в C, компилятор конечного автомата ragel - мой выбор.

0 голосов
/ 28 июля 2010

Я действительно не могу представить, что strstr медленнее, чем альтернатива с регулярным выражением - однако, если вам нужно извлечь различные значения HTTP-заголовка, то анализ пакетов будет довольно простым и лучшим вариантом. В libpcap нет встроенных парсеров?

...