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