URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3128
[ Назад ]

Исходное сообщение
"Socket таймаут"

Отправлено Brick , 05-Июл-04 13:37 
Приветсвую всех...
Тут такая проблемма: надо уменьшить таймаут при коннекте, смотрел setsockopt, там вроде как ничего такого нет, может кто чё-нить посоветует???

Содержание

Сообщения в этом обсуждении
"Socket таймаут"
Отправлено klalafuda , 05-Июл-04 15:03 
>Приветсвую всех...
>Тут такая проблемма: надо уменьшить таймаут при коннекте, смотрел setsockopt, там вроде
>как ничего такого нет, может кто чё-нить посоветует???

man alarm
man sigaction

// wbr


"Socket таймаут"
Отправлено SergeiZz , 05-Июл-04 17:01 
>Приветсвую всех...
>Тут такая проблемма: надо уменьшить таймаут при коннекте, смотрел setsockopt, там вроде
>как ничего такого нет, может кто чё-нить посоветует???
Подробнее.
Что такое "таймаут при коннекте".



"Socket таймаут"
Отправлено Brick , 08-Июл-04 23:50 
>>Приветсвую всех...
>>Тут такая проблемма: надо уменьшить таймаут при коннекте, смотрел setsockopt, там вроде
>>как ничего такого нет, может кто чё-нить посоветует???
>Подробнее.
>Что такое "таймаут при коннекте".
это когда клиентская часть пытается законнектиться к серверной, а серверная в это время недоступна, вот и таймаут - это время которое клиент ещё будет пытаться законнектиться, и надо его изменить; )



"Socket таймаут"
Отправлено Alexander S. Salieff , 09-Июл-04 17:33 
>Приветсвую всех...
>Тут такая проблемма: надо уменьшить таймаут при коннекте, смотрел setsockopt, там вроде
>как ничего такого нет, может кто чё-нить посоветует???

Ни алармами ни сигэкшенами (как советовали выше) играть не советую. В линухе механизм сигналов ваще штука опасная и лучше его не трогать - вонять не будет ;)
Лана, ближе к делу, все просто, нужно разблочить сокет послать его коннектится и poll-демультиплексором ждать коннекта в течении желаемого таймаута. Тока там есть некоторые тонкости в выковыриванием кода возврата. Выглядеть будет приблизительно так:

//timeout in seconds * 10-3 (millisec)
//timeout=-1 системный таймаут (около 2х минут)

int t_connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen, int timeout)
{
//Переведем сокет в неблокирующий режим
int cur_flg=-1;
if ((cur_flg=fcntl(sockfd, F_GETFL))==-1)
  return -1;
if (fcntl(sockfd, F_SETFL, cur_flg | O_NONBLOCK)==-1)
  return -1;
//Попытка соединения
if (connect(sockfd, serv_addr, addrlen)==-1)
  {
  if (errno!=EINPROGRESS)
   {
   fcntl(sockfd, F_SETFL, cur_flg);
   return -1;
   }
  }
//Крутим poll в течении timeout
struct pollfd ufds={sockfd, POLLOUT, 0};
int poll_ret = poll(&ufds, 1, timeout);
if (poll_ret<=0)
  {
  fcntl(sockfd, F_SETFL, cur_flg);
  return -1;
  }
if (!(ufds.revents&POLLOUT))
  {
  fcntl(sockfd, F_SETFL, cur_flg);
  return -1;
  }
//Вытаскиваем из сокета код возврата
int gso_ret = 0;
socklen_t gso_ret_len = (socklen_t)sizeof(gso_ret);

if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &gso_ret, &gso_ret_len)==-1)
  {
  fcntl(sockfd, F_SETFL, cur_flg);
  return -1;
  }
if (gso_ret!=0)
  {
  errno=gso_ret;
  fcntl(sockfd, F_SETFL, cur_flg);
  return -1;
  }
//Вернем сокет в блокирующий режим
if (fcntl(sockfd, F_SETFL, cur_flg)==-1)
  return -1;
return 0;
}

Причем вся инфа, о том, как это сделать, имеется в мане про коннект


"Socket таймаут"
Отправлено Brick , 11-Июл-04 13:25 
Спсибо всем ;)