我正在尝试通过Mac OS X上的原始套接字创建并发送DHCP REQUEST消息。我能够创建并发送格式正确的消息,但源IP地址除外。它应该是0.0.0.0。
Wireshark表示源地址是我在IP头的ip_src.s_addr字段中设置的内容,除非我使用0.0.0.0。当我使用0.0.0.0时,Wireshark将IP显示为发送数据包的机器。 FWIW,我可以将目标IP设置为255.255.255.255没问题。
如何将源IP设置为0.0.0.0?
在sin参数中使用的sin_addr.s_addr字段传递给sendto函数的目的是什么?改变或保持不设置似乎没有效果。
代码:
int s = socket (PF_INET, SOCK_RAW, IPPROTO_RAW);
if (s < 0)
{
perror("Failed to create raw socket");
exit(1);
}
if (setsockopt(s, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0)
{
perror("Failed to set raw socket options");
exit(1);
}
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_BROADCAST;
sin.sin_port = htons(67);
inet_pton(AF_INET, "255.255.255.255", &sin.sin_addr);
if (sendto (s, DHCPPacket, DHCPPacketLength, 0, (struct sockaddr *) &sin, sizeof (struct sockaddr)) < 0)
{
perror("sendto failed");
exit(-1);
}
else
{
printf ("Packet Send. Length : %d Payload size: %d Options size: %d\n", DHCPPacketLength, sizeof(DHCPmsgType),sizeof(DHCP_VendorType));
}