您用于在调用同一个套接字之前select()
检查给定套接字是否处于可读状态。connect()
那永远行不通。未连接的 TCP 套接字永远不会处于可读状态,并且在首先调用它select()
之前不能与它一起使用。connect()
实现connect()
调用超时的唯一方法是先将套接字置于非阻塞模式(默认情况下套接字是阻塞的),然后调用(如果套接字试图连接则connect()
返回错误),然后使用等待让socket进入可写状态,表示连接成功,或者进入错误状态,表示连接失败。EINPROGRESS
select()
尝试这个:
fcntl(s, F_SETFL, O_NONBLOCK);
或者:
flags = 1;
ioctl(s, FIOBIO, &flags);
取决于你的平台。
然后:
check_control = connect(s, (struct sockaddr*) &indirizzo_remoto, sizeof(indirizzo_remoto));
if (check_control == -1)
{
if (errno != EINPROGRESS)
{
printf("Errore connect()\n");
exit(-1);
}
FD_ZERO(&wset);
FD_SET(s, &wset);
FD_ZERO(&eset);
FD_SET(s, &eset);
tval.tv_sec = TIMEOUT;
tval.tv_usec = 0;
n = select(s+1, NULL, &wset, &eset, &tval);
if (n == -1)
{
printf(" select() failed \n");
exit(-1);
}
if (n == 0)
{
printf("Timeout. I'll shutdown the client");
exit(-1);
}
if (FD_ISSET(s, &eset))
{
printf("Cannot connect. I'll shutdown the client");
exit(-1);
}
int err = -1;
getsockopt(s, SOL_SOCKET, SO_ERROR, &err, sizeof(err));
if (err != 0)
{
printf("Cannot connect. I'll shutdown the client");
exit(-1);
}
}
// connected...