创造&在Mac OS

时间:2017-02-04 05:26:54

标签: sockets ip dhcp bsd raw-sockets

我正在尝试通过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));
}

0 个答案:

没有答案