![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TServerSocket: как отфильтровать подключаетмых клиентов? [D5, NT4, Win2k, WinXP]
ai © (2002-11-06 07:55:00)Всем доброе время суток! У меня нарисовалась проблемка: надо отфильтровать (разрешить или запретить доступ) для подключаемых клиентов к серверному сокету по какому-либо списку IP-адресов или имен компьютеров (сокет блокирующий). Пробовал это сделать в событиях OnAccept, OnGetSocket, OnGetThread
писал что-то вроде:
{Проверка IP по списку}
....
if Проверка_не_прошла Then Socket.Close;
Так вот. Первый раз клиент отсоединяется. Но при второй попытке клиент все-таки присоединяется (судя по состоянию его сокета), но на сервере при этом никаких событий OnAccept, OnGetSocket, OnGetThread уже не возникает!? Как будто после первого отсоединения сервер еще раз создает сокет... :(
Что надо еще сделать, чтобы отсоединение было "полноценным"?
Или может фильтровать в другом событии?
Digitman (2002-11-06 15:08:00) [1]>ai
Надеюсь таки - ты не в цирк пришел, где тебя "веселить" да "развлекать" будут, пока ты, развалившись в кресле, заложив ногу на ногу и лениво жуя бутерброд, праздно наблюдаешь за развитием "действа")))
Пару вполне дельных советов по сути вопроса ты получил. Изучай их детально и действуй !
ai (2002-11-06 14:59:00) [2]интересно, интересно!
Digitman (2002-11-06 14:50:00) [3]>ai
Есть, кстати, еще один вариант, достаточно "изуверский" и технически не самым простым способом реализуемы, но зато не требующий переделки TServerSocket)
Достаточно перехватить вызов WinsockAPI.accept() и подменить безусловный результат его работы на результат явно вызываемой (в теле ф-ции-обработчика перехвата) WinsockAPI.WSAAccept()
ai (2002-11-06 14:44:00) [4]>GoodMan
А действительно, стоит ли? чем они так хороши? Кто-нибудь что-то законченнное на них написал?
Digitman (2002-11-06 14:18:00) [5]>ai
Можно установить Indy в Д5 и как автономный набор компонент.
Только вот стоит ли ?
ai (2002-11-06 14:10:00) [6]>Digitman
"нет проблем" - в смысле (если я правильно понял) компоненты Indy входят в поставку Delphi6. Я пишу на D5
Digitman (2002-11-06 13:36:00) [7]>KPOT
Ты вообще о чем ? Какое отношение все это имеет к реализации условного акцепта ?
> ThreadCacheSize - количество клиентских процессов (Thread),
Thread - это кодовый поток, а не процесс.
> Кэширование происходит для того, чтобы не ... убивать закрытый сокет, а оставить ... для дальнейшего использования.
Гнездо (TServerClientWinSocket) после корректного разрыва канала кл.транспорта всегда уничтожается. Никакого отношения ни к кэшированию ни тем более к условному/безусловному акцепту функциональность и время жизни этого объекта не имеет, не выдумывай.
KPOT (2002-11-06 13:27:00) [8]Kak variant mozhesh poprobovat" ustanovit" ServerSocket.ThreadCacheSize := 0
ThreadCacheSize - количество клиентских процессов (Thread), которые будут кэшироваться сервером. Здесь необходимо подбирать среднее значение в зависимости от загруженности Вашего сервера. Кэширование происходит для того, чтобы не создавать каждый раз отдельный процесс и не убивать закрытый сокет, а оставить их для дальнейшего использования.
Digitman (2002-11-06 12:46:00) [9]
> нет проблем на Delhi6
Каких "проблем" ?
ai (2002-11-06 12:39:00) [10]ха! нет проблем на Delhi6 ;\ Я что-то не понял начет лицензии для других версий Делфи
Digitman (2002-11-06 11:09:00) [11]http://books.itep.ru
GoodMan (2002-11-06 10:47:00) [12]Ну почему люди сами создают себе поблемы...
Загляни на http://www.nevrona.com/indy- и будещь приятно удевлен.
ai (2002-11-06 10:42:00) [13]>всем
Спасибо за раъяснения. Не подкинете-ли ли ссылочки с описанием работы WinSocks и примерами реализации на WinAPI?
Digitman (2002-11-06 10:13:00) [14]
> ai
WSAAccept() - единственный корректный и верный способ заставить сервер выполнить действительно условный акцепт. TServerSocket, к сож., не использует этот вызов, а ,следовательно, безусловно акцептирует все кл.запросы на соединение (см. Accept()).
> Есть ли еще предложения?
Иных предложений нет и быть не может, если ты хочешь получить настоящий условный акцепт.
Переписывать "все проги заново" совершенно не обязательно, достаточно переписать код компонента TServerSocket (с учетом доп.возможностей вызова WSAAccept), выкинуть из палитпы стандартный компонент ServerSocket и включить в нее доработанный ServerSocket с неким новым событием типа OnConnectionRequest(). После этого во всех "прогах" будет достаточно предусмотреть небольшие участки доп.кода, обрабатывающего такое событие и возвращающее (как результат "фильтрационной" обработки) некий признак типа AcceptRequest (акцептировать текущий запрос на соединение) или RejectRequest (отвергнуть текущий запрос на соединение)
ai (2002-11-06 09:51:00) [15]>Polevi
переписать все проги заново?! спасибо, конечно. может я так и сделаю, но не сейчас. Сейчас надо внести дополнение в существующие...
Есть ли еще предложения?
Polevi (2002-11-06 09:12:00) [16]выбрось T..Socket и пиши все на api
WSAAccept тебе нужен