Многопоточный сервер
От: Joffa Россия  
Дата: 12.10.10 07:38
Оценка:
Здравствуйте, форумчане
Пишу многопоточный сервер в Delphi. Работает, как сервис(TService).
при инициализации TService, создаётся "серверный" объект TThread, в котором идёт приём подключений.
При каждом подключении и проверке его на допустимый адрес, создаётся "клиентский" объект TThread.
в свойства этого объекта передаются все необходимые для его работы значения (как то дескриптор сокета,
адресная структура и т.д.). и этот объект уже самостоятельно работает с ОДНИМ клиентским подключением,
обрабатывает пакеты, высылает ответы и т.д.
помимо этого, у "серверного" объекта TThread есть динамический массив этих самых "клиентских" объектов —
подключений.
необходимо это для того, чтобы при завершении работы TService, например, поочерёдно остановить все эти
"клиентские" TThread, затем "серверный" TThread и уничтожить все объекты.
Вопрос в следующем:
Клиентское подключение может внезапно завершиться с ошибкой, клиент может самостоятельно отключиться.
"клиентская" нить прекращает работу, но для сервера, она — всё ещё "активное" подключение и находится в
динамическом массиве. Т.е. возникает необходимость в — как бы — менеджере нитей, который будет
периодически — ОТ ЛИЦА СЕРВЕРА — добивать уже неработающие клиентские TThread'ы, "подчищать" свой динам.
массив "клиентских" TThread'ов.
но мне не нравится слово "периодически" — как-то не этично чтоли

и интересует: как, вообще, делается организация таких вещей? какие идеи вы можете посоветовать?
алсо, не прошу готового кода или чего-то такого. просто сталкиваюсь с этим — фактически — впервые.
поэтому прошу братского совета! ^^ заранее, спасибо.
delphi tthread tservice
Re: Многопоточный сервер
От: Pepel Беларусь  
Дата: 12.10.10 07:49
Оценка:
Здравствуйте, Joffa, Вы писали:

J>Здравствуйте, форумчане

J>Пишу многопоточный сервер в Delphi. Работает, как сервис(TService).

ну вы готовую конструкцию используете — смотрите сам компонент — его свойства и методы, вообщем эт скорее по делфям тема
Re: Многопоточный сервер
От: Michael Chelnokov Украина  
Дата: 12.10.10 07:52
Оценка:
Здравствуйте, Joffa, Вы писали:

J>и интересует: как, вообще, делается организация таких вещей?


Море способов. Например, клиентская нить перед прекращением работы просит серверный объект удалить ее из списка. В чем проблема-то?
Re: Многопоточный сервер
От: Аноним  
Дата: 12.10.10 10:34
Оценка:
Здравствуйте, Joffa, Вы писали:

J>Здравствуйте, форумчане

J>помимо этого, у "серверного" объекта TThread есть динамический массив этих самых "клиентских" объектов —
J>подключений.
Динамический массив-то зачем?
J>необходимо это для того, чтобы при завершении работы TService, например, поочерёдно остановить все эти
J>"клиентские" TThread, затем "серверный" TThread и уничтожить все объекты.

клиентский поток перед выходом (в finally секции, желательно) вызывает папу на предмет вынимания себя из списка
естественно, операции со списком надо оборачивать в критическую секцию
только я не использую дин массивы, у меня тупо сортированный TStringList ,
каждому вновь созданному клиенту назначается GUID, он, заодно, и ключ в списке для быстрого поиска себя и удаления
Re: Многопоточный сервер
От: Skipy Rich Россия  
Дата: 12.10.10 19:33
Оценка:
Здравствуйте, Joffa, Вы писали:

J>При каждом подключении и проверке его на допустимый адрес, создаётся "клиентский" объект TThread.


При кол-ве одновременных сессий > 100, либо при большом кол-ве коротких сессий такой сервер умрёт. Желательно использовать либо виндовый IOCP, либо самостоятельно организованный пул потоков.
Re[2]: Многопоточный сервер
От: hunter_707 Россия  
Дата: 14.10.10 12:25
Оценка:
Здравствуйте, Michael Chelnokov, Вы писали:

MC>Здравствуйте, Joffa, Вы писали:


J>>и интересует: как, вообще, делается организация таких вещей?


MC>Море способов. Например, клиентская нить перед прекращением работы просит серверный объект удалить ее из списка. В чем проблема-то?


именно + периодическая зачистка "папой" возможных "трупов" в свободное от основной работы время
Re[3]: Многопоточный сервер
От: Pepel Беларусь  
Дата: 14.10.10 12:31
Оценка:
Здравствуйте, hunter_707, Вы писали:

_>Здравствуйте, Michael Chelnokov, Вы писали:


MC>>Здравствуйте, Joffa, Вы писали:


J>>>и интересует: как, вообще, делается организация таких вещей?


MC>>Море способов. Например, клиентская нить перед прекращением работы просит серверный объект удалить ее из списка. В чем проблема-то?


_>именно + периодическая зачистка "папой" возможных "трупов" в свободное от основной работы время


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