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

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

Насколько мощен TServerSocket !!!??? [D5, D6, Win95/98, WinXP]


Страницы:   1 2

NET_MAN ©   (2003-02-14 13:53:00) 

Доброго Вам времени суток !
Недавно у меня возникла потребность в написании мощного сервера, который способен обслуживать запросы как минимум 100 юзеров и максимум 10000 !!!Когда то мне приходилось писать сервак для максимум 5-ти одновременно работающих пользователей, его я писал именно на TServerSocket . А щас проблема несколько выросла, хотелось бы прокансультироваться у знающих людей по этому вопросу...

Как Вы думаете стоит ли использовать TServerSocket или же
использовать что-либо еще !


Заранее спасибо за ответ !!!


Alex Konshin   (2003-02-20 09:31:00) [1]

Я активно использую completion routine и НЕ использую Read/WriteFile. И как-то особой необходимости в их использовании не вижу. Я в чем-то неправ?
Надо как-то на досуге хоть посмотреть, что же эти TServerSocket"ы такого делают, что люди так стремятся его использовать. Никогда не использовал.


Digitman   (2003-02-20 08:37:00) [2]

> Alex Konshin

В догонку :

наиболее значимым можно, скажем, отметить, что при изложенном подходе (база=scktcomp.pas + ws2_32.dll) удается достаточно просто реализовать true-conditional acceptance на платформенных winsoсk2-реализациях, дающих такую возможность в принципе.
Например, в Винтукее это делается оч и оч просто, при этом требуется минимальная надстройка над классами TServerSocket и TServerWinSocket.


Digitman   (2003-02-20 08:31:00) [3]


> Alex Konshin


Видишь ли, я просто хотел всем этим сказать, что функциональность стандартных объектов из модуля scktcomp.pas достаточно просто расширить (практически - без переделки), самостоятельно задействовав интерфейс winsock2 из ws2_32.dll
В одном ранних проектов (за неимением того же Indy на тот момент) я именно так и поступил - отказался от модели асинхр.оконной нотификации в пользу модели event-нотификации. Не думаю, что последняя чем-то уступает модели портов завершения. Более того, поскольку для использования модели портов завершения как правило приходится использовать станд.ф-ции файлового ввода/вывода (Read/WriteFile), я склонен с достаточным основанием предполагать, что функц."оболочка" файловых операций ввода/вывода отнюдь не способствует увеличению производительности транспортных алгоритмов с использованием гнезд (разумеется, не во всех случаях - в отдельных)


Alex Konshin   (2003-02-19 20:35:00) [4]

Ну так, естественно, поддержка старого winsock 1.x реализована как враппер для winsock2, об этом даже в документации говорится:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/changes_from_windows_sockets_1_1_2.asp
И также очевидно, что хендл сокета и в Африке хендл сокета, и не важно из какого winsock"а он получен.


Digitman   (2003-02-19 09:37:00) [5]

>Alex Konshin

да все ты верно говоришь)

да, winsock.pas декларирует/импортирует ф-ции из wsock32.dll.

но ! если у тебя установлен именно winsock2, не поленись посмотреть любыми средствами стат.зависимости модуля wsock32.dll

среди них ты увидишь зависимость от модуля ws2_32.dll в части ф-ций WSARecv, WSARecvFrom, GetSockOpt, SetSockOpt

о чем это говорит ? да о том, что если в системе присутствует именно winsock2, то при загрузке неким процессом модуля wsock32.dll будет автоматически загружен и модуль ws2_32.dll

для доступа к нужным ф-циям (относящимся к event-модели) автоматически загруженного модуля ws2_32.dll заинтересованному процессу остается только получить его хэндл и адреса этих ф-ций


$hade   (2003-02-19 07:36:00) [6]

Я пытался на IdTCPServer делать около 2.5т соединений....работает...правда все это не для моего Duron 800/128 RAM....:-) и желательно не выводить всякие сведения о соединениях куда нить типа ListView...не поймет...:-))


Alex Konshin   (2003-02-19 03:44:00) [7]

ws2_32.dll это и есть Winsock2, wsock32.dll - это Winsock 1.2
Юнит winsock.pas, который поставляется Борландом, описывает Winsock 1.2 (wsock32.dll) и ИМЕННО поэтому там нет указанных тобой функций. И где ты увидел загрузку ws2_32.dll?

Winsock 2 API определен в юните idWinsock2.pas, который идет в поставке Indy (не помню начиная с какой версии, но в той, что идет вместе с Delphi7 он уже есть). Но я советую все-таки использовать мой юнит: в нем есть полезные фичи, которые не включены в idWinsock2 (например, трассировка вызовов ws2_32.dll и возможность выбора между статической и динамической линковкой).
Чтоб отпали сомнения - загляни в копирайт idWinsock2.pas
Для тех, кто еще не знает, мой сайт - http://home.earthlink.net/~akonshin/



Digitman   (2003-02-18 09:25:00) [8]


> Alex Konshin


Да, и еще ..
При таком кол-ве одновременных коннектов, разумеется, по одной нити на коннект не удастся реализовать. Но поскольку даже при таком кол-ве соединений вероятность одновременно исполняемых клиентских запросов не столь велика, ничто не мешает попробовать организовать трэд-пул (скажем, например, установить размер трэд-пула в 100 раз меньшьшим числа коннектов) и исполнять запросы, выбирая из пула первый же свободный от исполнения запроса трэд и передавая ему параметры запроса на исполнение. Такой подход даст оптимальный результат параллельной обработки множества запросов при значительном числе коннектов.
Схема эта оч похожа на схему функц-я АТС(К, ДШ), где, скажем, на каждую сотню абон.комплектов (потенц.клиенты) установлен всего десяток-другой СЛ (трэд-пул). Т.е. только десяток-другой абонентов АТС могут одновременно быть обслужены в своих запросах на коннект и разговор, все остальные абоненты вынуждены ждать, пока не освободится хотя бы одна СЛ для обслуживания очер.запросов на коннект.


Digitman   (2003-02-18 08:52:00) [9]


> Alex Konshin


ws2_32.dll экспортирует ф-ции WSACreateEvent, WSAEventSelect, WSAEnumNetworkEvents, WSAWaitForMultipleObjects и т.п.

Библиотека эта грузится в модуле scktcomp, но, поскольку в non-blocking-режиме Борландом использована модель именно асинхр. оконных нотификаций, эти вызовы попросту не декларированы в winsock.pas, не импортируются и не используются. Но ничто не мешает задействовать эту event-модель (взамен async-модели), объявив и импортировав нужные event-ф-ции. Даже если SAStartup($0101, ..) !
В событии OnClientConnect для существующего хэндла гнезда (CustomWinSocket.WindowHandle) достаточно будет выполнить WSACreateEvent, WSAEventSelect - и winsock переключит гнездо в режим event-нотификаций


Alex Konshin   (2003-02-18 02:36:00) [10]

И где ты в Winsock 1.x увидел event"ы? Ты имеешь в виду WSAAsyncSelect и т.п.? И где же тут нотификация? Там же все в конце концов к очереди сообщений окна сводится!

Однозначно нужно использовать Winsock2 - меньше проблем и головной боли будет. В WS2 все намного прозрачнее и понятнее. Делаешь нити и пусть они ждут событий, а операции запускай overlapped. При таком кол-ве клиентов очевидно, что нельзя создавать по одной нити на каждый коннект - помни об этом.


Digitman   (2003-02-17 09:56:00) [11]


> Apple11



> TServerSocket построен на модели Асинхронных сообщений и
> использует Winsock1.1.


В режиме stThreadBlocking модель асинхронных сообщений не задействуется. Можно включить любую иную альтернативную модель - порты завершения и механизм нотификации через events.

Жестко "прошитая" в коде TCustomWinSocket инициализация Winsock 1.1 никак не мешает выбору любой из 3-х доступных моделей.


Apple11   (2003-02-17 07:54:00) [12]

Насколько я понимаю- TServerSocket построен на модели Асинхронных сообщений и использует Winsock1.1.
Для максимальной производительности лучше использовать Winsock2 и модель портов завершения.


Digitman   (2003-02-16 12:50:00) [13]


> NET_MAN


Сам TServerSocket по сути не вносит никаких ограничений на число одновременнных коннектов и размеры буферов / списков кэшируемых объектов. Единственное, что можно назвать "ограничением" - предельный диапазон целочисленных значений, которые может хранить Integer-переменная (переменные такого типа применяются в большинстве реализаций спискообразующих объектов VCL, на которых базируется этот компонент), используемая для хранения индексов в различного назначения списках в составе SerevrSocket-объекта.

Все прочие ограничения - это ограничения, вносимые Win32-ядром, Winsock-ядром и TCP-стеком


NET_MAN   (2003-02-15 18:07:00) [14]

спасибо за консультацию !...

... значит эксперимент провести нужно !...?
... подумаю как это сделать... как проведу обязательно результат в форум выкладу !...


Anatoly Podgoretsky   (2003-02-15 16:20:00) [15]

Функция АПИ то выделению номеров портов, там диапазон состовляет не то 4000 не то 5000 номеров, поищи сам в справке или если получится в архиве форума, этот вопрос несколько раз рассматривали в контексте как узнать порт.


Malder   (2003-02-15 15:59:00) [16]

Anatoly Podgoretsky ?


Malder   (2003-02-15 00:20:00) [17]

Насколько я помню в семействах win9x ограничение было в 255 одновременно открытых сокетов. А в линейке НТ это число, по моему, очень велико. Думаю, 10000 сокетов открыть можно, хотя не пробовал и не ручаюсь, что получится

Anatoly Podgoretsky
>да и диапазон выделяемых портов в системе где то 5000

что вы имеете в виду ?


Anatoly Podgoretsky   (2003-02-14 21:00:00) [18]

100 может
Но меня интересовал ответ про 10000 тут есть проблемы, но не с TServerSocket, а с системой, количество коннектов ограничено, да и диапазон выделяемых портов в системе где то 5000, подробности есть в MS SDK/MSDN


NET_MAN   (2003-02-14 20:30:00) [19]

Anatoly Podgoretsky © (14.02.03 18:29) >>

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


Anatoly Podgoretsky   (2003-02-14 18:29:00) [20]

NET_MAN (14.02.03 13:53)
Одновременно?


Страницы:   1 2

Наверх

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