我正在使用苹果的“简单Ping”示例,它几乎拥有我需要的所有功能,但我不知道在哪里可以设置每个数据包的超时。这似乎是不可能的,因为用于将数据写入套接字的函数没有任何超时参数。有没有人有办法改变这个应用程序来获得设置超时的能力,就像在windows ping命令中一样?我所说的超时是指在等待响应时间过长后,每个发送的数据包被丢弃的时间。
Windows ping命令-超时我需要:
-w超时:指定等待与要接收的给定回显请求消息相对应的回显回复消息的时间量(以毫秒为单位)。如果在超时时间内未收到回显回复消息,则会显示“请求超时”错误消息。默认超时为4000 (4秒)。
我正在使用的简单Ping代码:http://developer.apple.com/library/mac/#samplecode/SimplePing/Introduction/Intro.html
发布于 2011-09-16 20:26:04
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]
);查看苹果的文档:setsockopt
从上面引用的文档中:
SO_SNDTIMEO是为输出操作设置超时值的选项。它接受一个struct timbal参数,其中包含用于限制等待输出操作完成的秒数和微秒数。如果发送操作被阻塞了这么长时间,它将返回部分计数,如果没有发送数据,则返回错误EWOULDBLOCK。在当前实现中,每次将附加数据传送到协议时,该定时器都会重新启动,这意味着该限制适用于大小从用于输出的低水位标记到高水位标记的输出部分。
发布于 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));
有关其他选项,请执行以下操作:
https://stackoverflow.com/questions/7437643
复制相似问题