gpt4 book ai didi

c - struct tcphdr 中没有成员 th_seq(使用 pcap)

转载 作者:太空宇宙 更新时间:2023-11-04 03:49:27 25 4
gpt4 key购买 nike

我正在完成一项作业,其中一部分涉及使用 pcap 捕获数据包。我关注了 tutorial ,现在正在尝试我找到的一些代码 here , 这与此类似:

//#define __USE_BSD
//#define __FAVOR_BSD
#define MAXBYTES2CAPTURE 2048
#define SIZE_ETHERNET 14
#include <stdio.h>
#include <stdlib.h>
#include <libnet.h>
#include <string.h>
#include <pcap.h>
#include <netinet/tcp.h>
#include <netinet/ip.h>

int main(){
int count = 0;
bpf_u_int32 netaddr=0, mask=0;
pcap_t *descr = NULL;
struct bpf_program filter;
struct ip *iphdr = NULL;
struct tcphdr *tcphdr = NULL;
struct pcap_pkthdr pkthdr;
const unsigned char *packet = NULL;
char pcap_errbuf[PCAP_ERRBUF_SIZE];

descr = pcap_open_live("eth0", MAXBYTES2CAPTURE, 0, 512, pcap_errbuf );
pcap_lookupnet("eth0", &netaddr, &mask, pcap_errbuf );
pcap_compile( descr, &filter, "port 111", 1, mask );
pcap_setfilter( descr, &filter);

packet = pcap_next(descr, &pkthdr );
iphdr = (struct ip *)(packet+14);
tcphdr = (struct tcphdr *)(packet+14+20);
printf("SEQ: %d:\n", ntohl(tcphdr->th_seq) );
pcap_close(descr);
return(0);
}

问题是我得到一个编译错误:

‘struct tcphdr’ has no member named ‘th_seq’.

我发现更多人问这个问题,一些回复建议包括:

#define __USE_BSD
#define __FAVOR_BSD

但无论我是否添加它,我都会收到错误消息。 th_seq 应该包含在 netinet/tcp.h 中,对吗?我在 Ubuntu 12.04 和 linux 3.2 上测试了代码,都给出了错误。

有人知道如何解决这个问题吗?

最佳答案

这是一个古老的问题,但我可以回答它,在您自己的代码中,如果定义了 __FAVOR_BSD(不要自己定义),则使用 tcphdr->th_off,否则使用 tcphdr->doff。像这样:

#if (defined (__FAVOR_BSD))
len -= sizeof (uint32_t) * tcp->th_off;
packet += sizeof (uint32_t) * tcp->th_off;
#else
len -= sizeof (uint32_t) * tcp->doff;
packet += sizeof (uint32_t) * tcp->doff;
#endif

如果您这样做,您可能会遇到许可问题,但对于我正在做的事情,我不在乎 - 这是内部代码,不是产品的一部分,如果我们不得不将其 GPL,我们很乐意这样做。

tcphdr 的两个版本都工作得很好,只是出于某种原因它们的命名不同。如果您经常这样做,也可以只制作宏。我只是跳过 header ,直到我到达数据包中的数据以供检查。

关于c - struct tcphdr 中没有成员 th_seq(使用 pcap),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21893601/

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