C 睡眠设备的非阻塞I/O插槽
我有一些代码只是测试设备上的端口是否打开,为此我制作了一个小超时套接字函数:C 睡眠设备的非阻塞I/O插槽,c,sockets,nonblocking,C,Sockets,Nonblocking,我有一些代码只是测试设备上的端口是否打开,为此我制作了一个小超时套接字函数: int timeout_socket(struct sockaddr *addr, int timeout_ms) { int fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (fd < 0) return 0; int on = 1; setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &
int timeout_socket(struct sockaddr *addr, int timeout_ms) {
int fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (fd < 0) return 0;
int on = 1;
setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(int));
//Set the socket for non-blocking I/O
if (ioctl(fd, FIONBIO, (char *)&on) < 0) {
close(fd);
return 0;
}
int result = connect(fd, addr, sizeof(struct sockaddr_in));
if (result != 0 && errno != EINPROGRESS) {
close(fd);
return 0;
}
struct pollfd fds;
fds.fd = fd;
fds.events = POLLOUT;
//Poll for timeout_ms
while (1==1) {
int res = poll(&fds, 1, timeout_ms);
if (res == EINTR) continue;
if (fds.revents & POLLOUT || fds.revents & POLLIN) {
close(fd);
return 1;
}
break;
}
close(fd);
return 0;
}
问题是,当目标设备a Mac处于睡眠状态时,它会在connect方法运行后立即唤醒,但尽管超时时间大约为10000 10秒,它却没有响应
我可能的解决办法是:
使用插座/连接线连接到设备
关上它
打开/连接另一个插座
轮询超时\u ms
这是唯一的办法吗?这种行为对我来说似乎很奇怪,但我以前从未使用过带非阻塞的posix套接字。这是正常行为吗?在我看来,解决方法是在指定的超时时间内重试几次。这种行为实际上是由堆栈本身实现的,通常可以在系统范围内进行配置。。。检查操作系统上的TCP设置。但如果直接进行,只需循环:连接、等待、关闭并再次返回N次。是的,实施重试最终会起作用,但我如何区分这与连接失败?如果您自己执行重试,则失败定义由您控制。您可以定义您愿意等待SYN-ACK的时间以及您愿意重试SYN-ACK的次数。请注意,这可能与系统定义冲突,因为TCP堆栈通常有自己的超时和重试计数。