Ключевые слова:timeout, socket, (найти похожие документы)
Date: Thu, 11 Apr 2002 22:28:02 +0000 (UTC)
From: Lev Walkin <vlm@netli.com>
Newsgroups: fido7.ru.unix.prog
Subject: Сокращение TIME_WAIT, уменьшение таймаута
>>есть сервер слушает порт
>>есть клиент на тойже тачке который делает очень быстро и очень много запросов
>>к серверу по tcp/ip
>>в какой-то момент клиент вываливвается с месагой Ресурс недоступен ,
> Это может быть, например, потому что у сервера переполняется очередь входящих
> запросов (та, размер которой задается при listen()). Поскольку клиент находится
> на той же машине, много процессорного времени выделяется именно ему, и сервер не
> успевает делать им accept в оставшееся время.
TIME_WAIT - это состояние серверного сокета, в котором он находится 2msl
времени, чтобы собирать случайно задержавшиеся в сети пакеты.
Таймаут этот можно изменять в различных операционках по разному - во
FreeBSD есть sysctl на эту тему - net.inet.tcp.msl, равный тридцати
секундам по умолчанию. То есть, TIME_WAIT'с будут сидеть минуту на
сервере.
В Линуксе избавится от них можно, например, с помощью
setsockopt(SO_REUSEADDR), который заодно будет выгребать сокеты из
TIME_WAIT для повторного использования для новых коннектов.
--
Lev Walkin
vlm@netli.com
бред.
TIME_WAIT - одно из стандартных состояний TCP соединения, в который переходит сторона осуществляющая активное закрытие соединения.
Обойти TIME_WAIT можно только с помощью параметра SO_LINGER выставив в структуре linger l_onoff=1,l_linger=0. (тот кто это сделает будет проклят, поскольку навлечет на себя гнев богов, и кучу некорректно доставленных сегментов).
А SO_REUSEADDR -вообще не для этого нужно.