iOS - Ping超时

时间:2011-09-15 21:28:14

标签: iphone ios networking ping

我正在使用Apple的“简单Ping”示例,它几乎具有我需要的所有功能,但我不知道在哪里可以设置每个数据包的超时。似乎这是不可能的,因为用于向socket写入数据的函数没有任何超时参数。有没有人有想法改变这个应用程序,以获得设置超时的能力,如在Windows ping命令?通过超时,我指的是在等待响应太长时间之后发送的每个数据包被丢弃的时间。

Windows ping命令 - 超时我需要:

“ - w超时:指定等待与要接收的给定Echo请求消息对应的Echo Reply消息的时间量(以毫秒为单位)。如果在超时内未收到Echo Reply消息,显示“请求超时”错误消息。默认超时为4000(4秒)。“

我正在使用的简单Ping代码: http://developer.apple.com/library/mac/#samplecode/SimplePing/Introduction/Intro.html

2 个答案:

答案 0 :(得分:15)

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。在当前的实现中,每次将附加数据传送到协议时,该计时器都会重新启动,这意味着该限制适用于从低水位标记到高水位标记输出的输出部分。

答案 1 :(得分:0)

例如:

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));

了解其他选项:

http://developer.apple.com/library/ios/#documentation/system/conceptual/manpages_iphoneos/man2/setsockopt.2.html