Необходимо было реализовать connect с таймаутом, написал на неблокируемом сокете. Потестил, убедился что работает, но когда запустил на длительное время тестовую прогу которая конектилась к серверу, обменивалась данными, и отсоединялась, и так в цикле с несколькими серверами, увидел что по истечению нескольких десятков тысяч таких итераций приконектиться не получаеться. Сокет закрываю, утечек памяти нету, короче не знаю куда копать. А telnet к серверам конектиться без проблем.. Вот функция:
int status = 0;
if(!is_connect)
{
this->sock = new Socket();
this->sock->setNonBlock(status);
do
{
sock->connect(addr, port, status);
if(status == SOCK_ERR && sock->getErrNo() == EAGAIN)
{//No more free local ports or insufficient entries in the routing cache
usleep(200000);
timeout--;
}
}while(sock->getErrNo() == EAGAIN && timeout && status == SOCK_ERR);
if(status != SOCK_OK && sock->getErrNo() == EINPROGRESS && timeout)
{//the connection cannot be completed immediately
while(!is_connect && timeout != 0)
{//в этом цикле и останавливается до истечения timeout..
if(sock->selectWrite(status)!=0)
{
int err = 0;
socklen_t len = sizeof(err);
getsockopt(sock->sockfd, SOL_SOCKET, SO_ERROR, &err, &len);
if(err == 0)
{
is_connect = true;
this->sock->setRecvBufSize(64000);
this->sock->setSendBufSize(64000);
}
}
if(status != SOCK_OK)break;
timeout--;
}
}
if(!is_connect)
{
this->sockErrNo = sock->getErrNo();
delete this->sock;
this->sock = NULL;
}
}
return is_connect;
PS: в самом классе Socket нет ни чего сверх естественного, потому его функции выкладывать не считаю нужным.