2013-01-10 14 views
5

Chcę zrobić ping z limitem czasu i TTL. Używam kodu Apple ("Simple Ping"). Przeczytałem to: "iOS ping with timeout". Zmienić kod:Limit czasu iOS ping i 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] 
); 

Ale ja nie rozumiem, gdzie należy umieścić kod, który pokaże mi limit czasu odbioru pakietów. Muszę również wykonać ping z informacją TTL (time-to-live). Chcę uzyskać informacje na podstawie tego wzoru: icmp_seq=count from=ip_address ttl=value_of_ttl time=value_of_replytime_ms

Odpowiedz

-1

Zawsze można umieścić jakiś limit czasowy na receivefrom:

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

Aby zmodyfikować domyślny TTL w nagłówku IP, zadzwoń setsockopt z IP_TTL jako parametr (testowane z 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; 
 
}

"iOS ping with timeout" ex dodaj do gniazda limit czasu wyjścia. Z tego co rozumiem, upłynie limit czasu, jeśli pakiet nie zostanie wysłany przez gniazdo w tym okresie. Mogę się mylić, ale nie mogę znaleźć tej wartości "timeout" z nagłówka ICMP i nagłówka IPv4 (ICMP Packet format). Oto dziennik konsoli i prośba, pakiet odpowiedzi zrobione przy użyciu Apple prosty Ping:

enter image description here

enter image description here

enter image description here

Jeśli tylko chcesz znać czas odpowiedzi ping, ja zgadnij, że możesz to samemu śledzić w metodach delegatów. Uzyskaj znaczniki czasu, gdy wywołane są funkcje "didSendPacket" i "didReceivePingResponsePacket", a następnie porównaj różnicę.