Я использую SOCK_RAW
для создания сокета.
if((sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0)
{
perror("Error");
exit(1);
}
Я использую setsockopt, чтобы установить ttl в пакете, а затем перехватить пакет через wireshark.Тем не менее, ttl в пакете по-прежнему равен 1. getockopt
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.