- 论坛徽章:
- 0
|
1) 没有使用connect调用,但已经给IP首部中的dst addr 赋值
sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if(sockfd < 0)
{
perror("socket");
return 0;
}
if(setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0)
{
perror("setsockopt");
return 0;
}
.....
ip_header->ip_dst.s_addr = htonl(inet_network("10.0.0.18"));
....
write(sockfd, buf, buflen);
===> 此时,虽然设置了IP首部,但数据不能被发送,write调用出错,显示Destination address required
2) 使用connect调用,但没有给IP首部中的dst addr赋值(又或给以随机值)
sockaddr.sin_family = AF_INET;
sockaddr.sin_addr.s_addr = htonl(inet_network("10.0.0.18"));
sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if(sockfd < 0)
{
perror("socket");
return 0;
}
if(setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0)
{
perror("setsockopt");
return 0;
}
connect(sockfd, (struct sockaddr *)&sockaddr, sizeof(struct sockaddr_in));
.....
ip_header->ip_dst.s_addr = htonl(inet_network("172.21.8.18"));
....
write(sockfd, buf, buflen);
==> write调用能把数据发送出去,抓包显示数据帧中的dst ip地址为172.21.8.18,而数据帧中的MAC地址为10.0.0.18的MAC地址
??? |
|