LINUX.ORG.RU

connection timeout


0

0

Здравствуйте. Как при коннекте к сервреу по протоколу tcp указать таймаут соединения ?

anonymous

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

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).

Это то ? другого похожего не нашел, а здесь говорится что нельзя менять

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

Подскажите вообще как правильно обрабатывать 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 выйти из функции ?..

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

> 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;

anonymous
()
Ответ на: комментарий от idle

int tmout=3;

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) return 2; setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &tmout, 0x10); setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tmout, 0x10); if (connect(sockfd, (struct sockaddr *) &rmt, 0x10) == -1) { if (errno == ETIMEDOUT) puts("timeout"); return 3; }

Но нв строчке connect прога висит больше 3 секунд. Куда копать?

anonymous
()
Ответ на: комментарий от idle

int tmout=3;

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
		return 2;
	setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &tmout, 0x10);
	setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tmout, 0x10);
if (connect(sockfd, (struct sockaddr *) &rmt, 0x10) == -1) {
		if (errno == ETIMEDOUT) puts("timeout");
        return 3;
	}

Но на строчке connect прога висит больше 3 секунд. Куда копать?

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

Копать в сторону Стивенса: 13.2 Таймауты сокетов, 15.3 Неблокируемая функция connect.

Вкратце смысл в следующем: либо ты перед тем как начать коннектиться блокируемым сокетом устанавливаешь таймер на нужное тебе время, и вылетаешь из connect-a по SIGALRM с EINTR. Либо коннектишься неблокируемым сокетом и ждешь с нужным таймаутом в select-е... %)

Подробнее см. у Стивенса, книга -- рулез.

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

Хм, спасибо. Под рукой книги такой ессно нету, поэтому маленткий вопрос - как понять "вылетаешь из connect-a по SIGALRM с EINTR" ? Для этого достаточно просто выхвать alarm() с нужным мне временем ?

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

> int tmout=3;
> ...
> setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &tmout, 0x10);
> ...
> Куда копать?

копать в сторону man setsockopt, наверное. я, правда, не
знаю, есть ли там что про SO_SNDTIMEO.

ВСЕГДА НУЖНО ПРОВЕРЯТЬ ЧТО ВОЗВРАЩАЕТ СИСТЕМНЫЙ ВЫЗОВ.
если бы вы это делали - сэкономили бы время себе и всем.

параметр для SO_SNDTIMEO не количество секунд, а
struct timeval *

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

Проверка была, после того как стала возвращать 0, я ее убрал :) Спасибо за помощь

anonymous
()
Ответ на: комментарий от idle

Ок, спасибо, заработало :) Только не могу понять что значит выводимая кем то при timeout строчка - Operation now in progress ?

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