SO_RCVTIMEO and SO_SNDTIMEO
Specify the sending or receiving timeouts until reporting an error. They are fixed to a
protocol specific setting in Linux and cannot be read or written. Their functionality
can be emulated using alarm(2) or setitimer(2).
Это то ? другого похожего не нашел, а здесь говорится что нельзя менять
Подскажите вообще как правильно обрабатывать connection timeout ? Т.е. если цепляюсь на порт сервера, и долго нет ответа - что будет ? Вот пример моего кода:
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
return 2;
if (bind(sockfd, (struct sockaddr *) &local_ip, 0x10) == -1)
return 4;
if (connect(sockfd, (struct sockaddr *) &rmt, 0x10) == -1)
return 3;
recv(sockfd, buf, RECV_BUF, 0);
Где что делать чтобы при timeout выйти из функции ?..
> They are fixed to a protocol specific setting in Linux
> and cannot be read or written.
man врет.
net/core/sock.c:sock_setsockopt()
case SO_RCVTIMEO:
ret = sock_set_timeout(&sk->sk_rcvtimeo, optval, optlen);
break;
case SO_SNDTIMEO:
ret = sock_set_timeout(&sk->sk_sndtimeo, optval, optlen);
break;
Копать в сторону Стивенса: 13.2 Таймауты сокетов, 15.3 Неблокируемая функция connect.
Вкратце смысл в следующем: либо ты перед тем как начать коннектиться блокируемым сокетом устанавливаешь таймер на нужное тебе время, и вылетаешь из connect-a по SIGALRM с EINTR. Либо коннектишься неблокируемым сокетом и ждешь с нужным таймаутом в select-е... %)
Хм, спасибо. Под рукой книги такой ессно нету, поэтому маленткий вопрос - как понять "вылетаешь из connect-a по SIGALRM с EINTR" ? Для этого достаточно просто выхвать alarm() с нужным мне временем ?
> int tmout=3;
> ...
> setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &tmout, 0x10);
> ...
> Куда копать?
копать в сторону man setsockopt, наверное. я, правда, не
знаю, есть ли там что про SO_SNDTIMEO.
ВСЕГДА НУЖНО ПРОВЕРЯТЬ ЧТО ВОЗВРАЩАЕТ СИСТЕМНЫЙ ВЫЗОВ.
если бы вы это делали - сэкономили бы время себе и всем.
параметр для SO_SNDTIMEO не количество секунд, а
struct timeval *