什么时候O_NONBLOCK socket上的connect()能否用EINPROGRESS或EALREADY以外的东西失败?

时间:2017-08-24 09:03:19

标签: sockets unix posix portability errno

我阅读了以下示例代码,我想知道是否有人可以说明connect()哪些平台可能因EINPROGRESS或EALREADY以外的其他原因而失败。

失败的意思是执行要执行的示例中的else分支。消息来源中的评论建议使用FreeBSD。还有其他系统吗?我无法在Linux上失败。

        if (connect(hostp->sockets[i],
            (struct sockaddr *)res->ai_addr,
            res->ai_addrlen) == -1) {
            /* This is what we expect. */
            if (errno == EINPROGRESS) {
                printf("    connect EINPROGRESS OK "
                    "(expected)\n");
                FD_SET(hostp->sockets[i], &wrfds);
            } else {
                /*
                 * This may happen right here, on
                 * localhost for example (immediate
                 * connection refused).
                 * I can see that happen on FreeBSD
                 * but not on Solaris, for example.
                 */
                printf("    connect: %s\n",
                    strerror(errno));
                ++n;
            }
        [...]

来源:http://mff.devnull.cz/pvu/src/tcp/non-blocking-connect.c

1 个答案:

答案 0 :(得分:3)

连接失败的方法有很多种。正如评论所说,如果没有监听服务器,即使非连接连接在某些平台上也可能在连接到localhost时立即失败。如果无法确定目标路由,则连接通常也会立即失败,例如,如果默认路由的接口已关闭。然后还有其他失败方法,例如内存不足,在沙箱内运行时拒绝连接的权限或类似内容。