原始套接字:发送自制IP / TCP数据包时添加了意外的IP标头

时间:2015-10-22 02:54:43

标签: sockets network-programming raw-sockets

我想使用原始套接字发送TCP数据包,这是一个完整的IP数据包(因此数据包有IP头,TCP头和TCP有效负载,但没有以太网头.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来捕获已发送的数据包,并注意它已向IP数据包添加了额外的IP头,并且IP协议号为255(ip-> ip_p为255)。所以它有两个IP头(具有相同的src和dst IP对),这是意料之外的。

有什么问题?谢谢!

1 个答案:

答案 0 :(得分:2)

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