2013-01-10 9 views
5

Desidero eseguire il ping con timeout e TTL. Uso il codice di Apple ("Simple Ping"). L'ho letto "iOS ping with timeout". Cambio codice:Timeout iOS di ping e ttl

CFSocketNativeHandle sock = CFSocketGetNative(self->_socket); 
struct timeval tv; 
tv.tv_sec = 0; 
tv.tv_usec = 100000; // 0.1 sec 
setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (void *)&tv, sizeof(tv)); 

bytesSent = sendto(
    sock, 
    [packet bytes], 
    [packet length], 
    0, 
    (struct sockaddr *) [self.hostAddress bytes], 
    (socklen_t) [self.hostAddress length] 
); 

Ma non capisco dove dovrei inserire il codice che mi mostrerà il timeout di ricezione dei pacchetti. Inoltre ho bisogno di fare ping con le informazioni TTL (time-to-live). Voglio avere informazioni in base a questo schema: icmp_seq=count from=ip_address ttl=value_of_ttl time=value_of_replytime_ms

risposta

-1

Si può sempre mettere un po 'di tempo limite per il ReceiveFrom:

 tv.tv_sec = 0; 
     tv.tv_usec = 10000; 
     setsockopt(recv_sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv,sizeof(struct timeval)); 
0

Per modificare il TTL di default in intestazione IP, chiamare setsockopt con IP_TTL come parametro (testato con IPv4):

- (BOOL)setTTL:(int)ttl{ 
 
    CFSocketNativeHandle sock = CFSocketGetNative(self->_socket); 
 
    int status = setsockopt(sock, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)); 
 
    if(status < 0) 
 
    { 
 
     return NO; 
 
    } 
 
    return YES; 
 
}

Il "iOS ping with timeout" ex Ampio aggiungere un timeout di output al socket. Da quanto ho capito, si spegnerà se il pacchetto non è stato inviato dal socket entro questo periodo. Potrei sbagliarmi, ma non riesco a trovare questo valore di "timeout" dall'intestazione ICMP e dall'intestazione IPv4 (ICMP Packet format). Ecco i log della console e la richiesta, pacchetto di risposta catturato utilizzando semplici ping di Apple:

enter image description here

enter image description here

enter image description here

Se si desidera solo conoscere il tempo di risposta del ping, ho Immagina di poterlo seguire da solo nei metodi dei delegati. Ottieni timestamp quando le funzioni "didSendPacket" e "didReceivePingResponsePacket" hanno chiamato e quindi confrontano la differenza.