我使用SOCK_RAW
创建套接字。
if((sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0)
{
perror("Error");
exit(1);
}
我使用setsockopt在数据包中设置ttl,然后通过wireshark捕获数据包。但是,数据包中的ttl仍然为1。getsockopt
int ttl = 0;
while(ttl < MAX_TTL) // MAX_TTL is 56
{
memset(recv,0,BUFFER_SIZE);
ttl++;
if(setsockopt(sockfd, IPPROTO_IP, IP_TTL, (char *)&ttl, sizeof(ttl)) < 0)
{
perror("Error");
close(sockfd);
exit(1);
}
if(sendto(sockfd, message, packet_len, 0, (struct sockaddr*) &remote_addr,addr_len) < 0)
{
perror("Error");
close(sockfd);
exit(1);
}
if((ret = recvfrom(sockfd, recv, BUFFER_SIZE, 0,(struct sockaddr*) &remote_addr,(socklen_t *)&addr_len)) < 0)
{
//perror("Error");
if(ret == EWOULDBLOCK || ret == EAGAIN)
{
printf("time out\n");
}
}
ICMP_packet_upack(recv, ret);
sleep(3);
//break;
}
平台是macOS,并使用clang进行编译。