我有一些代码只测试一个端口是否在设备上打开,为此我做了一个超时套接字函数:
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;
}
问题在于,当目标设备(Mac)处于休眠状态时,它会在connect方法运行后立即唤醒,但是尽管timeout_ms类似于10000(10secs),它只是没有响应。
我可能的解决方法是:
这是唯一的方法吗?这种行为对我来说似乎很奇怪,但我之前从未使用过非阻塞的posix套接字。这是正常行为吗?