pcap_next_ex () никогда не устанавливает указатель на необработанный пакет?

Я пытался читать в сыром пакете с 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));
}
}
}


Любая идея?

Заранее спасибо.

0

Решение

На самом деле, что 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() возвращает:

  • 1, если пакет был прочитан или захвачен, в этом случае указатель должен быть установлен на необработанный пакет;
  • 0, если это прямой захват и тайм-аут (как указано в pcap_open_live() или, если вы использовали pcap_create() а также pcap_activate(), pcap_set_timeout()) истекло во время ожидания пакета, и в этом случае пакет не был прочитан, и указатель будет установлен в NULL;
  • -1, если при чтении или захвате произошла ошибка, в этом случае пакет не был прочитан и указатель будет установлен в NULL;
  • -2, если это файл, который читается, и не осталось больше пакетов для чтения, и в этом случае пакет не был прочитан, и указатель будет установлен в 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
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]