我想用超时和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
答案 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获取的控制台日志和请求,响应数据包:
如果你只想知道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));