iOS – Ping超时
我正在使用Apple的“简单Ping”示例,它几乎具有我需要的所有function,但我不知道在哪里可以设置每个数据包的超时。 似乎不可能,因为用于向socket写入数据的函数没有任何超时参数。 有没有人有想法改变这个应用程序以获得设置超时的能力,如在Windows ping命令? 通过超时,我指的是在等待响应太长时间后发送的每个数据包被丢弃的时间。
Windows ping命令 – 超时我需要:
“-w Timeout:指定等待与要接收的给定Echo Request消息对应的Echo Reply消息的时间量(以毫秒为单位)。如果在超时内未收到Echo Reply消息,则为”Request“超时“显示错误信息。默认超时为4000(4秒)。”
我正在使用的简单Ping代码: http : //developer.apple.com/library/mac/#samplecode/SimplePing/Introduction/Intro.html
Apple示例代码:
bytesSent = sendto( CFSocketGetNative(self->_socket), sock, [packet bytes], [packet length], 0, (struct sockaddr *) [self.hostAddress bytes], (socklen_t) [self.hostAddress length] );
更改超时:
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] );
请参阅Apple的文档: setsockopt
从上面提到的doc:
SO_SNDTIMEO是为输出操作设置超时值的选项。 它接受struct timbal参数,其中包含用于限制输出操作完成等待的秒数和微秒数。 如果发送操作在这么长时间内被阻塞,则返回部分计数或如果没有数据发送则返回错误EWOULDBLOCK。 在当前实现中,每次将附加数据传递到协议时重新启动该计时器,这意味着该限制适用于从低水位标记到高水位标记的输出部分,用于输出。
例如:
tv.tv_sec = 0;
tv.tv_usec = 1000;
setsockopt(recv_sock,SOL_SOCKET,SO_RCVTIMEO,(char *)&tv,sizeof(struct timeval));
setsockopt(send_sock,SOL_SOCKET,SO_SNDTIMEO,(char *)&tv,sizeof(struct timeval));
有关其他选项: