Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 睡眠设备的非阻塞I/O插槽_C_Sockets_Nonblocking - Fatal编程技术网

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堆栈通常有自己的超时和重试计数。