5

我想用超时和 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

4

2 回答 2

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 数据包格式)中找到这个“超时”值。以下是使用苹果的简单 ping 捕获的控制台日志和请求、响应数据包:

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

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

于 2015-12-22T03:30:31.450 回答
-1

您总是可以对接收者设置一些限制时间:

        tv.tv_sec = 0;
        tv.tv_usec = 10000;
        setsockopt(recv_sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv,sizeof(struct   timeval));
于 2013-01-13T14:50:00.147 回答