Необходимо было реализовать 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 нет ни чего сверх естественного, потому его функции выкладывать не считаю нужным.
Ответ на:
комментарий
от Eshkin_kot
Ответ на:
комментарий
от TaranSergey
Ответ на:
комментарий
от TaranSergey
Ответ на:
комментарий
от tailgunner
Ответ на:
комментарий
от TaranSergey
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум покритикуйте следующий код(не мой) (2005)
- Форум connect return -1 errno = 105 (ENOBUFS) (2005)
- Форум Непонятки с сокетами (2006)
- Форум Уничтожение дочернего процесса (2004)
- Форум куда пойдём мы с recvfrom? (2016)
- Форум Получение списка интерфейсов через netlink (2013)
- Форум Perl & win32 (2005)
- Форум Сокеты, Передача данных, C/C++ (2006)
- Форум Проблема с сокетами (2011)
- Форум Пример программы UDP-сервера (2014)