睡眠设备的非阻塞I / O插座

时间:2012-03-17 20:23:47

标签: 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, &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),它只是没有响应。

我可能的解决方法是:

  • 使用socket / connect
  • 连接到设备
  • 关闭它
  • 打开/连接另一个插座
  • 轮询timeout_ms

这是唯一的方法吗?这种行为对我来说似乎很奇怪,但我之前从未使用过非阻塞的posix套接字。这是正常行为吗?

0 个答案:

没有答案
相关问题