ping和ttl的iOS超时

时间:2013-01-10 06:30:40

标签: iphone ios networking timeout ping

我想用超时和TTL进行ping操作。我使用Apple的代码("Simple Ping")。我读了 "iOS ping with timeout"。我改变了代码:

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

2 个答案:

答案 0 :(得分: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)中找到此“超时”值。 以下是使用apple的简单ping获取的控制台日志和请求,响应数据包:

enter image description here

enter image description here

enter image description here

如果你只想知道ping的响应时间,我想你可以在委托方法中自己跟踪它。调用“didSendPacket”和“didReceivePingResponsePacket”函数时获取时间戳,然后比较差异。

答案 1 :(得分:-1)

您可以随时在receivefrom上设置一些限制时间:

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