Я пытался читать в сыром пакете с libpcap (1.4.0 на CentOS 6).
Однако по некоторым причинам rawPacket всегда равен NULL после pcap_next_ex ().
Тем не менее, pcap_next_ex () возвращает 1, хотя это может означать, что время ожидания истекло (где время ожидания установлено кстати?).
Сначала я подумал, что строка фильтра, которую я передал в pcap_compile (), неверна. Но я попытался скопировать и вставить ту же строку в tcpdump, она работала нормально — я вижу ожидаемые пакеты, которые были захвачены.
struct pcap_pkthdr *pHeader;
const u_char* rawPacket = NULL;
int rc = 0;
while (1) {
rc = pcap_next_ex(pDevice, &pHeader, &rawPacket);
if (-1 != rc && NULL != rawPacket) {
// process
struct ether_header* eptr = (struct ether_header *) rawPacket;
if (ntohs (eptr->ether_type) == ETHERTYPE_IP) {
printf("Ethernet type hex:%x dec:%d is an IP packet\n",
ntohs(eptr->ether_type),
ntohs(eptr->ether_type));
}
}
}
Любая идея?
Заранее спасибо.
На самом деле, что pcap_next_ex()
страница руководства говорит
pcap_next_ex() returns 1 if the packet was read without problems, 0 if
packets are being read from a live capture, and the timeout expired, -1
if an error occurred while reading the packet, and -2 if packets are
being read from a ``savefile'', and there are no more packets to read
from the savefile. If -1 is returned, pcap_geterr() or pcap_perror()
may be called with p as an argument to fetch or display the error text.
Мне нужно отредактировать его, чтобы удалить комментарий между «живым захватом» и «истечением времени ожидания», потому что это означает, что pcap_next_ex()
возвращает:
pcap_open_live()
или, если вы использовали pcap_create()
а также pcap_activate()
, pcap_set_timeout()
) истекло во время ожидания пакета, и в этом случае пакет не был прочитан, и указатель будет установлен в NULL;Итак, что вы должны сделать после pcap_next_ex()
вызов, это:
if (1 == rc) {
// process
struct ether_header* eptr = (struct ether_header *) rawPacket;
if (ntohs (eptr->ether_type) == ETHERTYPE_IP) {
printf("Ethernet type hex:%x dec:%d is an IP packet\n",
ntohs(eptr->ether_type),
ntohs(eptr->ether_type));
}
} else if (0 == rc) {
// do nothing here - this isn't an error, but you have no packet
;
} else if (-1 == rc) {
// error
fprintf(stderr, "Error capturing or reading: %s\n", pcap_geterr(pDevice));
// quit trying to read or capture packets here
} else if (-2 == rc) {
// end of file if you're reading from a file
// this isn't an error, but there are no more packets to read
// so quit trying to read packets here
}
Других решений пока нет …