嗨,我目前正在学习用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){
...
}
...
}
首先,根据RFC 791的IPv4标志:
位0:保留,必须为零
所以你应该避免改变它。
但是,如果您的应用程序确实需要它,那么您不能使用典型的SOCK_DGRAM
,而是必须使用SOCK_RAW
,这允许构建您自己的完整数据包。主要缺点是必须填充以太网标头并计算校验和(针对IP和UDP标头(。此外,使用SOCK_RAW
的应用程序需要root权限或CAP_NET_RAW
功能。
有关SOCK_RAW
的更多信息,您可以查看手册页packet
。在线版本在这里。