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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.