Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.07.2008, 23:44   #1
vynt
Пользователь
 
Регистрация: 16.05.2008
Сообщений: 17
Смущение Сколько клиентов может одновремнно подключиться к серверу?

Новая тема - так новая тема хотя речь о той же проге.
Попытался протестировать на максимум входящих подключений к серверу, а их теоритически может быть до 100 000.
Написал программку со списком клиентов, которые согласно указанному количеству создаються динамически...

Попытка создать 2048 сокетов - дает число сокетов в пределах 1400 - 1800 штук на один порт. Причем! подключиться к другому порту удаётся, но обмена данными нет уже не по одному сокету. Попытки создать большее число сокетов приводит к заморозке программки со списком клиентов, после чего она закрывается без каких либо сообщений об ошибке.
Весь день рылся в и-нете, но вразумительного ответа так и не нашёл. Вопросы:

1. На что распростроняется это ограничение, на входящие или исходящие соединения, или и те и другие суммарно?

2. Можно ли это ограничение снять, например в реестре?

Использую: Delphi 7, IdTCPServer из Indy 10, Windows XP Pro Sp2, Pentium M64, RAM 2048Gb, без файла подкачки.

После запуска сервера и тестовой программки с клиентами: свободной памяти - полно, процессор загружен менее чем на 1%
vynt вне форума Ответить с цитированием
Старый 02.07.2008, 11:37   #2
vynt
Пользователь
 
Регистрация: 16.05.2008
Сообщений: 17
По умолчанию

А под отладчиком сервер говорит out of memory...
vynt вне форума Ответить с цитированием
Старый 02.07.2008, 11:48   #3
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

vynt, как организовано копирование сокета? Если по потоку на клиент, то очень много потоков создать не получится. Плюс расходы пула на сокеты и сами потоки и т.д.
B_N вне форума Ответить с цитированием
Старый 02.07.2008, 12:53   #4
vynt
Пользователь
 
Регистрация: 16.05.2008
Сообщений: 17
По умолчанию

Так ведь Indy же... конечно, поток на каждого клиента.
Похоже придётся таки создовать свой движок для сокетов.
Через ..IoCompletionPort наверное.
Примерчик бы какой посмотреть, знает кто и где, а?

Очень нужно чтобы была возможность подключения такого количества сокетов, и без разрыва соединений т.к. прием/передача происходит редко, но, может неожиданно потребоваться связь с клиентом...
vynt вне форума Ответить с цитированием
Старый 02.07.2008, 23:38   #5
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Я никогда не работал с Indy, поэтому и уточняю. Очень много потоков создать не выйдет, арифметика простая - 2Гб памяти на мегабайт стэка на поток по умолчанию выходит около 2000 потоков максимум. Это без учёта TEB'ов, кода, данных и т.д. Completion ports - самое разумное решение, в крайнем случае completion routines. Посмотрите "Network Programming for Microsoft Windows" (Anthony Jones и Jim Ohlund, MS Press). Там примеры по всем способам ввода-вывода через сокеты и краткое рассмотрение ограничений, вроде тех, в которые Вы и "упёрлись", плюс глава с соображениями по созданию мощных сереров под NT.
---------------
P.S. Не знаю, правда, как это стыкуется с Indy...
B_N вне форума Ответить с цитированием
Старый 03.07.2008, 14:10   #6
vynt
Пользователь
 
Регистрация: 16.05.2008
Сообщений: 17
По умолчанию

А можно вместо Thread использовать Fiber? Там можно явно указать размер стека, в отличии от первого...Правда работать с "нитями" мне пока не приходилось.
Indy - на данный момент обеспечивает наибольшую стабильность, количество и качество, из уже 5-7 испытанных альтернативных компонентов... Есть в Indy и безпоточный сервер (только принимает подключения).
Хотелось бы конечно найти/иметь готовый компонент с необходимой функциональностью
vynt вне форума Ответить с цитированием
Старый 03.07.2008, 14:35   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от vynt Посмотреть сообщение
А можно вместо Thread использовать Fiber? Там можно явно указать размер стека, в отличии от первого...
А это ничего особенного не даст, только добавит головной боли, например, с синхронизацией. К тому же для "обычных" потоков тоже можно указывать размер стэка. Только ни к чему это всё, Вы же сами уже нашли лучшее решение. Работайте в направлении completion ports. Да и зачем Вам какие-то компоненты искать? Там кода получитсястрок на сто максимум.... Ещё раз повторю, не работал с Indy и не могу сказать, возможно там всё это уже реализовано...
B_N вне форума Ответить с цитированием
Старый 03.07.2008, 18:01   #8
vynt
Пользователь
 
Регистрация: 16.05.2008
Сообщений: 17
По умолчанию

Попробовал через select() - те же яйца только в профиль!
Щас попытаюсь с completion ports.
(Знал бы мой шеф, чем я занимаюсь с компьюетром...)
А на счёт сокетов в потоке - значит ли то, что они "привязаны" к объёму памяти, что с её увеличением можно будет создать большее количество сокетов?
Перекладывать на плечи юзеров свои проблемы не красиво, но временно можно
vynt вне форума Ответить с цитированием
Старый 03.07.2008, 18:34   #9
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от vynt Посмотреть сообщение
А на счёт сокетов в потоке - значит ли то, что они "привязаны" к объёму памяти, что с её увеличением можно будет создать большее количество сокетов?
Нет. Имеются в виду не Ваши 2 Gb, а 2 (в крайнем случае, с ключём /3GB - три) Gb, которые выделяются процессу для Ring3.
B_N вне форума Ответить с цитированием
Старый 03.07.2008, 21:44   #10
vynt
Пользователь
 
Регистрация: 16.05.2008
Сообщений: 17
По умолчанию

Таааак. Вот проблема, с completion ports, а как определить что клиент отключился? (или лучше уже в новую тему?)
vynt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите оценить, сколько может стоить проект. Его покупают - сколько взять? grenles Свободное общение 4 16.07.2008 09:38
Помогите подключиться к серверу. КривойПрограммист Помощь студентам 1 27.10.2007 23:41
Сервер и несколько клиентов Andr Работа с сетью в Delphi 10 17.09.2007 09:24
Как подключиться к серверу используя API функции? BR17UY Win Api 3 16.04.2007 02:12
Создать список клиентов банка Klyan Паскаль, Turbo Pascal, PascalABC.NET 3 15.01.2007 12:45