原始套接字:发送 self-made IP/TCP 数据包时添加了意外的 IP header

Raw socket: unexpected IP header added when sending self-made IP/TCP packets

我想使用原始套接字发送 TCP 数据包,它是一个完整的 IP 数据包(因此数据包具有 IP header、TCP header 和 TCP 负载,但没有以太网 header. IP源地址和目的地址在一个WLAN中,192.168.0.105和192.168.0.103),代码如下

    int on;
    on = 0;
    if ((sendfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {
            perror("raw socket");
            exit(1);
    }
    if (setsockopt(sendfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) {
            perror("setsockopt");
            exit(1);
    }

    nr_bytes = sendto(sendfd, packet, ip_len, 0, (struct sockaddr*)&client_addr, addr_len);

我用TCPdump抓取sent-out包,发现在IP包中多了一个IPheader,IP协议号为255(ip->ip_p 为 255)。所以它有两个 IP headers(具有相同的一对 src 和 dst IP),这是意外的。

有什么问题?谢谢!

使用 IPPROTO_RAW 隐式启用选项 IP_HDRINCL
在调用 setsockopt() 时,您再次禁用了 IP_HDRINCL,因为您设置了 on = 0.
尝试删除 setsockopt() 或设置 on = 1.