Создаем продвинутый боевой софт! Иван Скляров Хакер, номер #096, стр. 096-080-4 Функция pcap_geterr() возвращает описание ошибки, в качестве параметра она принимает дескриптор открытой сессии. Захват и обработка пакетов Для перехвата пакетов может использоваться одна из четырех функций: pcap_next(), pcap_next_ex(), pcap_dispatch() или pcap_loop(). Первые две функции за один вызов захватывают только по одному пакету. Вот их прототипы: const u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h) int pcap_next_ex(pcap_t *p, struct pcap_pkthdr **pkt_header, const u_char **pkt_data) Первый аргумент в обеих функциях — это дескриптор открытой сессии. Второй аргумент — это указатель на структуру, описывающую принятый пакет (определение структуры смотри ниже в этом разделе). Третий аргумент имеет только вторая функция — это указатель на область памяти, где сохранен принятый пакет. Первая функция возвращает указатель на область памяти, в которой сохранен принятый пакет. Вторая функция возвращает одно из следующих числовых значений: 1 — пакет был прочитан; 2 — время ожидания истекло; –1 — произошла ошибка; –2 — пакеты прочитаны из сохраненного файла и больше не доступны. Если поместить эти функции в цикл, то можно организовать перехват заданного количества пакетов. Но лучше всего для циклического перехвата использовать функции pcap_loop() или pcap_dispatch(). Эти две функции имеют фактически идентичные прототипы: int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user) int pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user) Первый аргумент — это дескриптор открытой сессии. Второй аргумент — это целое число, указывающее, сколько пакетов требуется перехватить (–1 обозначает, что перехват должен продолжаться, пока не произойдет ошибка). Третий аргумент — это имя callback-функции, которая автоматически будет вызываться библиотекой libpcap каждый раз, когда будет приходить очередной пакет. Последний аргумент может использоваться для передачи каких-либо данных в callback-функцию или устанавливается в NULL. Обе функции возвращают следующие значения: 0 — перехвачено cnt пакетов; –1 — произошла ошибка; –2 — цикл был оборван функцией pcap_breakloop() (существует только в новых версиях библиотеки libpcap). Единственное различие между этими двумя функциями в том, как они обрабатывают тайм-аут, величина которого задается при вызове pcap_open_live(). Функция pcap_loop(), в отличие от pcap_dispatch(), игнорирует тайм-ауты. Подробности смотри в man pcap. Callback-функция - это не любая функция произвольного формата, она имеет свой прототип: void process_packet (u_char *user, const struct pcap_pkthdr *header, const u_char *packet) Первый аргумент — это указатель на данные, которые передаются в callback-функцию из последнего аргумента функции pcap_loop(). Второй аргумент — указатель на структуру pcap_pkthdr, которая описывает захваченный пакет. Эта структура определена в pcap.h следующим образом: struct pcap_pkthdr { struct timeval ts; /* временная метка */ bpf_u_int32 caplen; /* длина захваченных данных */ |