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



嗨,我目前正在学习用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。在线版本在这里。

最新更新