>Приветсвую всех...
>Тут такая проблемма: надо уменьшить таймаут при коннекте, смотрел 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;
}
Причем вся инфа, о том, как это сделать, имеется в мане про коннект