connect()在阻塞套接字上返回“Operation now in progress”?

我有一个阻塞套接字(至less在下面的代码中显示如此):

sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock < 0) { ERROR("%s: error opening socket", __func__); return (RESP_ERROR); } t.tv_sec = timeout; t.tv_usec = 0; int rf = fcntl(sock, F_GETFD); ERROR("fcntl ret=%d, ret & O_NONBLOCK = %d", rf, rf & O_NONBLOCK); if ((setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&t, sizeof (t)) < 0) || (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&t, sizeof (t)))) { strerror_r(errno, err, 254); ERROR("%s: error on setsockopt -> %s", __func__, err); close(sock); return (RESP_ERROR); } rf = fcntl(sock, F_GETFD); ERROR("after select fcntl ret=%d, ret & O_NONBLOCK = %d", rf, rf & O_NONBLOCK); if (connect(sock, (struct sockaddr *)&dst, sizeof (dst)) != 0) { strerror_r(errno, err, 254); ERROR("%s: error on connect -> %s", __func__, err); close(sock); return (RESP_ERROR); } 

这是从日志:

Mar 6 10:42:04 tcpclient:fcntl ret = 0,ret&O_NONBLOCK = 0

Mar 6 10:42:04 tcpclient:selectfcntl ret = 0之后,ret&O_NONBLOCK = 0

3月6日10:42:14 tcpclient:validation:连接错误 – >正在进行操作

看来这是一个阻塞的套接字,但返回非阻塞典型的错误? Linux是2.6.18-308.el5。 有任何想法吗?

如果timeout不在0connect()调用超时并返回。 这与连接是否建立无关。

从超时过期的那一刻起, connect()行为就好像在非套接字套接字上调用一样。

引用这个案例(逐字逐句man connect ,忽略下面的“ 立即 ”):

EINPROGRESS

套接字是非阻塞的,连接不能立即完成。 通过选择用于写入的套接字,可以选择(2)或轮询(2)来完成。 select(2)指示可写性后,使用getsockopt(2)读取SOL_SOCKET级别的SO_ERROR选项,以确定connect()是否成功完成(SO_ERROR为零)或失败(SO_ERROR是此处列出的常见错误代码之一,导致失败的原因)。


顺便说一句:有人可以确认这是标准的行为,并为此明确提到的地方?

man 7 socket状态(由我斜体):

SO_RCVTIMEO和SO_SNDTIMEO

指定接收或发送超时,直到报告错误。 如果没有数据传输,并且超时已经达到,则返回-1,errno设置为EAGAIN或EWOULDBLOCK, 就好像套接字被指定为非阻塞一样 。 超时只对执行套接字I / O(例如read(2),recvmsg(2),send(2),sendmsg(2))的系统调用有效。 超时对select(2),poll(2),epoll_wait(2)等没有影响。

没有关于connect()所以我不确定我的答案是否成立。

尝试用'if((connect(…))<0)'。 你可能没有得到一个错误。