繁体   English   中英

在调用 sendto() 之前修改来自 UDP 套接字的 IP 标头

[英]Modify IP header from an UDP socket before calling sendto()

嗨,我目前正在使用 C++ 学习套接字编程,出于测试目的,我想在使用套接字发送数据之前修改 UDP 包的 IP 标头中的保留位。

我当前的代码如下所示:

if((sock_udp = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        perror("Socket error");
        return(-1);
    }

    strcpy(buffer, "Hello");
    int length = strlen(buffer) +1;

    destaddr.sin_family = AF_INET;
    inet_aton(ip, &destaddr.sin_addr);
    destaddr.sin_port = htons(port);

    // Can I somehow modify the IP header here?

    if(sendto(sock_udp, buffer, length, 0, (const struct sockaddr *)&destaddr, sizeof(destaddr)) >= 0){
       ...
    }
    ...
}

首先,根据 IPv4 标志的 RFC 791:

位 0:保留,必须为零

所以你应该避免改变它。

但是如果您的应用程序确实需要它,那么您不能使用典型的SOCK_DGRAM ,而是必须使用SOCK_RAW ,它允许构建您自己的完整数据包。 主要缺点是您必须填充以太网标头并计算校验和(针对 IP 和 UDP 标头)。 此外,使用SOCK_RAW应用程序需要 root 权限或CAP_NET_RAW功能。

有关SOCK_RAW更多信息,您可以查看手册页packet 在线版本在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM