Неблокирующая розетка ввода / вывода для спящего устройства - PullRequest
0 голосов
/ 18 марта 2012

У меня есть код, который просто проверяет, открыт ли порт на устройстве, для этого я сделал небольшую функцию сокета тайм-аута:

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-сокеты с неблокирующими.Это нормальное поведение?

...