У меня есть код, который просто проверяет, открыт ли порт на устройстве, для этого я сделал небольшую функцию сокета тайм-аута:
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 (10 сек), он просто не отвечает.
Мое возможное исправление:
- Подключение к устройству с помощью сокета / подключение
- Закрытие
- Открытие / подключение другого разъема
- Опрос для timeout_ms
Это единственный способ?Такое поведение кажется мне странным, но я никогда раньше не использовал posix-сокеты с неблокирующими.Это нормальное поведение?