libnet tcp头结果全部为零

libnet tcp头结果全部为零,c,sockets,libpcap,handshake,libnet,C,Sockets,Libpcap,Handshake,Libnet,我正在使用libnet和pcap编写几行C代码 其目的是手动执行3路握手,嗅探NIC上的过滤流量,查找SYN数据包,并使用原始ipv4套接字创建SYN-ACK响应 我使用pcap\u loop()成功接收原始SYN数据包 在我的自定义数据包处理程序()中,我执行以下操作: void packet_handler(u_char *user_args, const struct pcap_pkthdr *cap_header, const u_char *packet) { struct

我正在使用libnetpcap编写几行C代码

其目的是手动执行3路握手,嗅探NIC上的过滤流量,查找SYN数据包,并使用原始ipv4套接字创建SYN-ACK响应

我使用
pcap\u loop()
成功接收原始SYN数据包

在我的自定义
数据包处理程序()
中,我执行以下操作:

void packet_handler(u_char *user_args, const struct pcap_pkthdr *cap_header, const u_char *packet) {

    struct libnet_ipv4_hdr *ip = (struct libnet_ipv4_hdr *)(packet + LIBNET_ETH_H);
    struct libnet_tcp_hdr *tcp = (struct libnet_tcp_hdr *)(ip + (ip->ip_hl << 2));

    printf(
        "%s:%"PRIu16" > %s:%"PRIu16"\t[seq: %"PRIu32"\tack: %"PRIu32"]\n",
        libnet_addr2name4(ip->ip_src.s_addr, LIBNET_DONT_RESOLVE),
        ntohs(tcp->th_sport),
        libnet_addr2name4(ip->ip_dst.s_addr, LIBNET_DONT_RESOLVE),
        ntohs(tcp->th_dport),
        ntohl(tcp->th_seq), ntohl(tcp->th_ack)
    );
}
正如您所看到的,IP头被正确读取,但TCP头没有被正确读取。 特别是,
libnet\u tcp\u hdr
头字段导致全部为零


指针分配是否有问题?

首先,您需要验证数据包处理程序是否只接收承载TCP的IP数据包,而不是UDP

但是,您的指针算法是错误的。指针算术是基于指针的类型完成的,而不是基于字节。这意味着该代码:

struct libnet_tcp_hdr *tcp = (struct libnet_tcp_hdr *)(ip + (ip->ip_hl << 2));
这可能会更清楚地表明发生了什么

您需要将该代码更改为:

struct libnet_tcp_hdr *tcp = (struct libnet_tcp_hdr *)((unsigned char*)ip + (ip->ip_hl << 2));

struct libnet\u tcp\u hdr*tcp=(struct libnet\u tcp\u hdr*)((unsigned char*)ip+(ip->ip\u hl我不必检查tcp数据包,因为我在
pcap\u循环()之前过滤它。
。顺便说一句,答案非常清楚,谢谢!
struct libnet_tcp_hdr *tcp = (struct libnet_tcp_hdr *)(&ip[ip->ip_hl << 2]);
struct libnet_tcp_hdr *tcp = (struct libnet_tcp_hdr *)((unsigned char*)ip + (ip->ip_hl << 2));