Извините, если это хромой вопрос. Я новичок в ТСРйитр и pcap. Я использую статическую библиотеку pcap для разработки и приложения, которое прослушивает данные TCP на указанном порту. У меня есть небольшой прототип, и он хорошо работает при прослушивании tcp-пакетов, отправленных через порт 80 (по умолчанию из HTTP). Однако я хотел бы просмотреть HTTP-пакеты к порту 5984 и обратно (это порт по умолчанию, который использует CouchDB). Мое приложение по какой-то причине не замечает / нюхает / не видит никаких пакетов на этом порту. Поскольку я не опытный сетевой разработчик, я, вероятно, упускаю что-то фундаментальное.
Я не хочу вставлять здесь все приложение, но могу добавить любой код, необходимый для поиска проблемы. Пожалуйста, просто дайте мне знать.
Это выражение моего фильтра pcap:
char filter_exp[] = "tcp port 5984";/* The filter expression */
Фильтр компилируется и устанавливается на сессии pcap без проблем. Сеанс настроен на работу в случайном режиме.
//get a pcap session
//args device, # of packets to capture, promisc mode, timeout, err buff
handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf);
if (handle == NULL) {
fprintf(stderr, "Couldn't open device %s: %s\n", dev, errbuf);
return(2);
//compile our filter
if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) {
fprintf(stderr, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle));
return(2);
}
//set the filter
if (pcap_setfilter(handle, &fp) == -1) {
fprintf(stderr, "Couldn't install filter %s: %s\n", filter_exp, pcap_geterr(handle));
return(2);
}
//begin sniffing packets. cnt -1: keep sniffing until err occurs
//last arg is optional. It can be used to pass additonal information to callback
pcap_loop(handle, -1, got_packet, NULL);
‘got_packet’ — это моя функция обратного вызова. Это вызывается много раз с использованием одного и того же фильтра, но с портом 80 вместо 5984.
Используя Curl, я попробовал: $ curl http://localhost:5984/test
Просто, черт возьми, я пытался использовать loopback: $ curl http://127.0.0.1:5984/test
Они оба остаются незамеченными моим приложением pcap. Однако, если я изменю свой фильтр, чтобы прослушивать порт 80 и сделать $ curl http://www.google.com
Я вижу пакеты, проходящие через. Что я пропускаю или не понимаю?
Большое спасибо!
-Ник
Если пакеты отправляются с вашего Mac на тот же Mac — например, если вы общаетесь с «localhost» или 127.0.0.1 (что одно и то же — «localhost» разрешается до 127.0.0.1), захват на lo0
, не на en0
или же en1
, Трафик на 127.0.0.1 не отправляется ни в какую реальную сеть, он возвращается к вашей машине внутри сети, поэтому вам нужно искать сеть «loopback» и интерфейс «loopback».
(Подобные ответы применимы и для других UN * X, за исключением того, что в Linux интерфейс обратной петли называется просто lo
не lo0
, В Windows нет аналога, а в некоторых версиях UN * X, таких как Solaris 10 и более ранних, вы не можете захватить в интерфейсе обратной связи.)
Других решений пока нет …