首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS -带超时的Ping

问iOS -带超时的Ping
EN

Stack Overflow用户
提问于 2011-09-16 05:28:14
回答 2查看 19.8K关注 0票数 10

我正在使用苹果的“简单Ping”示例,它几乎拥有我需要的所有功能,但我不知道在哪里可以设置每个数据包的超时。这似乎是不可能的,因为用于将数据写入套接字的函数没有任何超时参数。有没有人有办法改变这个应用程序来获得设置超时的能力,就像在windows ping命令中一样?我所说的超时是指在等待响应时间过长后,每个发送的数据包被丢弃的时间。

Windows ping命令-超时我需要:

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-16 20:26:04

Apple示例代码:

代码语言:javascript
复制
bytesSent = sendto(
    CFSocketGetNative(self->_socket),
    sock,
    [packet bytes],
    [packet length], 
    0, 
    (struct sockaddr *) [self.hostAddress bytes], 
    (socklen_t) [self.hostAddress length]
);

要更改超时,请执行以下操作:

代码语言:javascript
复制
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]
);

查看苹果的文档:setsockopt

从上面引用的文档中:

SO_SNDTIMEO是为输出操作设置超时值的选项。它接受一个struct timbal参数,其中包含用于限制等待输出操作完成的秒数和微秒数。如果发送操作被阻塞了这么长时间,它将返回部分计数,如果没有发送数据,则返回错误EWOULDBLOCK。在当前实现中,每次将附加数据传送到协议时,该定时器都会重新启动,这意味着该限制适用于大小从用于输出的低水位标记到高水位标记的输出部分。

票数 15
EN

Stack Overflow用户

发布于 2013-01-10 20:29:32

例如:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7437643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档