gpt4 book ai didi

c++ - pcap_next_ex() 永远不会将指针设置为原始数据包?

转载 作者:行者123 更新时间:2023-11-30 17:40:10 29 4
gpt4 key购买 nike

我尝试使用 libpcap 读取原始数据包(CentOS 6 上为 1.4.0)。

但是,由于某些原因,在 pcap_next_ex() 之后 rawPacket 始终为 NULL。

但是,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() 返回:

  • 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
}

关于c++ - pcap_next_ex() 永远不会将指针设置为原始数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21603507/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com