From wget source code…
bool test_socket_open (int sock) { fd_set check_set; struct timeval to; int ret = 0; /* Check if we still have a valid (non-EOF) connection. From Andrew * Maholski's code in the Unix Socket FAQ. */ FD_ZERO (&check_set); FD_SET (sock, &check_set); /* Wait one microsecond */ to.tv_sec = 0; to.tv_usec = 1; ret = select (sock + 1, &check_set, NULL, NULL, &to); #ifdef WINDOWS /* gnulib select() converts blocking sockets to nonblocking in windows. wget uses blocking sockets so we must convert them back to blocking */ set_windows_fd_as_blocking_socket ( sock ); #endif if ( !ret ) /* We got a timeout, it means we're still connected. */ return true; else /* Read now would not wait, it means we have either pending data or EOF/error. */ return false; }
(转载请注明出处, 使用许可: 署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议 。)