[英]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.