Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / listen & accept / 5 сообщений из 5, страница 1 из 1
28.08.2006, 17:38
    #33947660
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
listen & accept
Была поставлена след. задача: ограничить кол-во подключений к серверу.
Сделал, на сервере все ок, а вот некоторые клиенты думают, что соединяются, хотя сервер после лимита не пользует больше accept. Оказалось что дело в listen - точнее в размере очереди подключений. Сделал очередь равной 0, теперь только один клиент тупит - типа соединяется.

Так что же выходит, для клиента соединение наступает когда он попал к серверу в очередь listen, т.е. до вызова accept, которое может так никогда и не произойти???
Также выходит, что очередь не бывает равна 0, минимум 1. После вызова accept место сразу освобождается и туда запуливается след. клиент и кричит, что приконнектился.

И как мне теперь сделать, чтобы ни один клиент не тупил???
...
Рейтинг: 0 / 0
28.08.2006, 18:49
    #33947888
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
listen & accept
нет, listen будет работать если очередь = 0, это точно.

Клиент, получивший неудачу в listen - получает ошибку ECONNREFUSED - именно в том случае если очередь полна, т.е. если один клиент уже есть (в случае 0)
вообще надо указывать тип ОС, ибо интерпретируют параметр backlog разные ОС и разные их версии по-разному: это или количество запросов или количество полностью установленных соединений.

Лучше всего посмотреть снифером, что же именно происходит, когда "клиент тупит"
imho.
...
Рейтинг: 0 / 0
28.08.2006, 19:20
    #33947966
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
listen & accept
Очередь = 0 или 1 неважно. Главное, что клиент попав в эту очередь успешно завершает функцию connect у себя. Т.е. он реально "думает", что соединился, хотя на серваке стоит ограничение, по достижении которого accept боллее не вызывается, а "тупящий" клиент продолжает висеть как бы в listen'e (очереди). Выходит, что клиент не тупит, просто он не знает, что accept для него вызван не будет. Может это можно устранить, если закрывать слушающий сокет, но тогда потом придется его заново открывать, биндить, когда соединений станет мало, поэтому закрывать не выход.
...
Рейтинг: 0 / 0
28.08.2006, 21:06
    #33948096
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
listen & accept
imho лучше не мудрить с очередью, а вести список коннекций и вновь входящие при исчерпании лимита сразу завершать вызовом close()
...
Рейтинг: 0 / 0
29.08.2006, 12:52
    #33949292
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
listen & accept
--null--imho лучше не мудрить с очередью, а вести список коннекций и вновь входящие при исчерпании лимита сразу завершать вызовом close()

Я полагал, что есть более красивое решение. Значит придется именно так.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / listen & accept / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]