Advertisement
Guest User

iOS IPv4 trace

a guest
Jun 23rd, 2018
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. + (NSString *)makeTrace:(const char *)address :(int)ttl_t :(int)timeout
  2. {
  3.     struct hostent *host_entry = gethostbyname(address);
  4.    
  5.     if(host_entry == nil || host_entry->h_addr_list == 0)
  6.     {
  7.         return nil;
  8.     }
  9.    
  10.     char *ip_addr = inet_ntoa(*((struct in_addr *)host_entry->h_addr_list[0]));
  11.     struct sockaddr_in destination, fromAddr;
  12.     int recv_sock;
  13.     int send_sock;
  14.    
  15.     if((recv_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP)) < 0)
  16.     {
  17.         return nil;
  18.     }
  19.    
  20.     if((send_sock = socket(AF_INET , SOCK_DGRAM, IPPROTO_IP)) < 0)
  21.     {
  22.         return nil;
  23.     }
  24.    
  25.     int ttl = (int)ttl_t;
  26.    
  27.     memset(&destination, 0, sizeof(destination));
  28.     destination.sin_family = AF_INET;
  29.     destination.sin_addr.s_addr = inet_addr(ip_addr);
  30.     destination.sin_port = htons(33434);
  31.    
  32.     struct timeval tv;
  33.     tv.tv_sec = timeout / 1000;
  34.     tv.tv_usec = (timeout % 1000) * 1000;
  35.    
  36.     if(setsockopt(recv_sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  37.     {
  38.         return nil;
  39.     }
  40.    
  41.     NSTimeInterval timeInSeconds = [[NSDate date] timeIntervalSince1970];
  42.     NSString *timestamp = [NSString stringWithFormat:@"%f", timeInSeconds];
  43.     const char *cmsg = [timestamp UTF8String];
  44.     socklen_t n = sizeof(fromAddr);
  45.     int buffer_size = BUFFER_SIZE;
  46.     void *buffer;
  47.     buffer = malloc(buffer_size);
  48.     memset(&fromAddr, 0, sizeof(fromAddr));
  49.    
  50.     if(setsockopt(send_sock, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)) < 0)
  51.     {
  52.         return nil;
  53.     }
  54.    
  55.     if(sendto(send_sock, cmsg, sizeof(cmsg), 0, (struct sockaddr *) &destination,sizeof(destination)) != sizeof(cmsg))
  56.     {
  57.         return nil;
  58.     }
  59.    
  60.     ssize_t bytesRead = recvfrom(recv_sock, buffer, buffer_size, 0, (struct sockaddr *)&fromAddr, &n);
  61.    
  62.     if(setsockopt(recv_sock, SOL_SOCKET, SO_RCVBUF, &buffer_size, sizeof(buffer_size)) < 0)
  63.     {
  64.         return nil;
  65.     }
  66.    
  67.     NSString *result = nil;
  68.  
  69.     if(bytesRead > 0)
  70.     {
  71.         char display[INET_ADDRSTRLEN]= {0};
  72.         inet_ntop(AF_INET, &fromAddr.sin_addr.s_addr, display, sizeof (display));
  73.         //@"Received packet from%s for TTL=%d\n";//, display;
  74.         result = [NSString stringWithCString:display encoding:NSUTF8StringEncoding];
  75.     }
  76.    
  77.     close(send_sock);
  78.     close(recv_sock);
  79.     free(buffer);
  80.     return result;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement