LINUX.ORG.RU

Неблокируемый connect


0

0

Необходимо было реализовать 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 нет ни чего сверх естественного, потому его функции выкладывать не считаю нужным.

Ответ на: комментарий от TaranSergey

Сейчас увидел, что эта проблема возникает спустя некоторое количетсво коннектов и если ни чего не трогать сама пропадает через некоторое врямя.. У меня такое впечатление, что в системе заканчивается какой-то ресурс, который чиститься постепенно..

TaranSergey
() автор топика
Ответ на: комментарий от TaranSergey

У тебя где-то что-то не закрывается или закрывается не так, как надо - возможно, в клиентской тестовой проге. Посмотри на вывод netstat - нет ди у тебя там сокетов в полузакрытом состоянии.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Причина была в том что переполнялся ip_conntrack. Всего-то сообщения ядра надо было посмотреть :). Вначале увеличил размер ip_conntrack, но жто привело к торможению системы, а потом вообще выключил. Самое забавное то, что если connect на блокируемом сокете, то connect вешает прогу пока не почиститься таблица, хотя как мне кажеться можно было бы вернуть EAGAIN..

TaranSergey
() автор топика
Ответ на: комментарий от TaranSergey

Нет, мне так не кажется. Я его вызвал без спешки, пусть висит и ждет ресурса.

roy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.