2013-01-10 106 views
5

我想用超時和TTL進行ping。我使用Apple的代碼("Simple Ping")。我讀過它 "iOS ping with timeout"。我改變代碼:iOS和超時的ping和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] 
); 

但我不明白我應該把代碼放在哪裏會顯示我接收數據包的超時。此外,我需要使用TTL(生存時間)信息進行ping。我想根據這個模式得到信息:icmp_seq=count from=ip_address ttl=value_of_ttl time=value_of_replytime_ms

回答

-1

你總是可以把一些限制時間上receivefrom:

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

要修改IP頭中的缺省TTL,與IP_TTL調用setsockopt的作爲參數(測試與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"前充足的將輸出超時添加到套接字。據我所知,如果封包在這段時間內沒有被套接字發送,它將會超時。我可能是錯的,但我無法從ICMP頭和IPv4頭(ICMP Packet format)中找到此「超時」值。 這裏是控制檯日誌和請求,響應數據包使用蘋果的簡單的ping捕獲:

enter image description here

enter image description here

enter image description here

如果你只是想知道的ping的響應時間,我猜猜你可以在委託方法中自己跟蹤它。獲取調用「didSendPacket」和「didReceivePingResponsePacket」函數時的時間戳,然後比較差異。