TTL не изменяется в пакете ICMP - PullRequest
0 голосов
/ 01 марта 2019

Я использую 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...