我有一个阻挡插座(至少它,以便将出现在下面的代码):connect()返回阻塞套接字上的“正在进行中的操作”?
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);
}
这是从日志:
03月06日10时42分04秒的TcpClient:RET的fcntl = 0 ,RET & O_NONBLOCK = 0
03月06日10时42分04秒的TcpClient:后选择的fcntl RET = 0,保留& O_NONBLOCK = 0
03月06日十点42分14秒的TcpClient :验证:错误连接 - >正在进行的操作
看来这是一个阻塞的套接字,但返回非阻塞的典型错误? Linux是2.6.18-308.el5。有任何想法吗?
'timeout'有哪个值? – alk 2013-03-06 10:04:23
为了验证我的答案,我想做一些测试。因此,我想知道'dst'在传递给connect()之前如何被初始化。你确定它的成员'sin_family'已经设置正确吗? – alk 2013-03-07 07:24:18