ICMP数据包中的TTL不变

时间:2019-03-01 12:55:01

标签: c sockets

我使用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进行编译。

0 个答案:

没有答案