Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Серьезный TCP сервер.


Страницы:   1 2

Николас ©   (2006-09-22 09:15:00) 

Стоит задача в обслуживании большого колличества клиентов, 100-1000 одновременных TCP соединений с постоянным обменом данными... Причем связь с сервером будет осуществлятся по разным каналам, от GPRS до LAN. Сейчас это реализовано на WinAPI Winsock. На локальной машине все работает хорошо для одного клиента, но достаточно попробова подключиться по не очень хорошему каналу связи, то начинаются потери пакетов, реализация протокола не допускает потери даже одного пакета, поэтому должна быть надежная реализация сервера.

Основной сетевой код работает в основном потоке, осуществляет обработку событий сокета и отправляет пришедшие данные на обработку. Есть проблема в приеме данных, когда пришла только часть данных от одного клиента, то мы ждем остальных данных, функция обработки полученных данных вызвается пока не придут все данные и пока мы не удалим их из очереди сокета, это сильно нагружает процессор, вариант со SLeep(100) снимает нагрузку с процессора, но так же усыпляет весь поток на 100мс, что критично для данного способа, ведь остальные клиенты должнв продолжать работу...

Неужели придется создавать для каждого клиента отдельный поток ? Есть у вас варианты для реализации? Может уже готовый компонент использовать?


Ketmar   (2006-09-22 10:46:00) [21]

>[10] Polevi(c) 22-Sep-XLI A.S., 10:44
>>Ketmar c   (22.09.06 10:01) [6]
>несерьезно делать подобные заявления
а я там не зря "имо" приписал. %-)


Polevi   (2006-09-22 10:44:00) [22]

>Ketmar ©   (22.09.06 10:01) [6]
несерьезно делать подобные заявления


Ketmar   (2006-09-22 10:22:00) [23]

>[7] Николас 22-Sep-XLI A.S., 10:12
>Lineage II к примеру под винду и держит несколько
>тысяч клиентов одновременно.
что совершенно не говорит о необходимости дублирования сией порочной практики. %-)


Сергей М.   (2006-09-22 10:21:00) [24]


> IO Completion Port... кто-нибудь знает про это ?


Кто-нибудь обязательно знает...
Например, справка по Winsock2 и MSDN ...

см. WSASend/Recv


> Создавать 1000 потоков я думаю будет слишком жестоко


Жестоко или не жестоко - это надо просчитывать, опираясь на интенсивность клиентских запросов.


Николас   (2006-09-22 10:12:00) [25]

Давайте не будем про несерьезность? Сервер Lineage II к примеру под винду и держит несколько тысяч клиентов одновременно. Насколько я понял там используется IO Completion Port... кто-нибудь знает про это ?

Создавать 1000 потоков я думаю будет слишком жестоко...:(


Ketmar   (2006-09-22 10:01:00) [26]

>[5] Орион(c) 22-Sep-XLI A.S., 09:56
>Ketmar, тогда уже "Не серьезный TCP сервер" %))
а сервера подобного плана на винде держать -- это уже само по себе несерьёзно. имо.


Орион   (2006-09-22 09:56:00) [27]

Ketmar, тогда уже "Не серьезный TCP сервер" %))


Ketmar   (2006-09-22 09:51:00) [28]

>[3] Орион(c) 22-Sep-XLI A.S., 09:46
>Но это гемморное решение. Блокирующий режим -
>самое оно.
при 500 активных потоках это становится большим вопросом. %-)


Орион   (2006-09-22 09:46:00) [29]

Если же хочется именно неблокирующий режим, то ждать - не верно.
Для каждого клиента создавай буфер (TMemoryStream, TStringStream?) и по пришествии очередной порции данных сохраняй ее в буфер, далее прверяй последний ли это кусок, если да - бери данные из буфера, обарабатывай, очищяй буфер; если нет - ничего не делай :)

Но это гемморное решение. Блокирующий режим - самое оно.


Ketmar   (2006-09-22 09:33:00) [30]

логика изначально неверна. если "ждать" -- то блокирующие сокеты и потоки. если не ждать, то неблокирующие. вообще -- зависит от того, насколько сложна обработка. и вообще -- лучше подобное на базе какой-нибудь *nix-системы делать.


Орион   (2006-09-22 09:27:00) [31]

Тут есть намного большие специалисты, чем я, но раз уж их пока нет :))

> Неужели придется создавать для каждого клиента отдельный
> поток ?

Да.

> Есть у вас варианты для реализации?
> Может уже готовый компонент использовать?

Indy используй. Уже все реализовано за тебя ;)
Компонент - TIdTCPServer


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо