![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Насколько мощен TServerSocket !!!??? [D5, D6, Win95/98, WinXP]
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)
Одновременно?