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

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

Ограничить кол-во входящих соединений [D7, Win2k]


sunsay ©   (2005-09-03 08:37:00) 

Привет мастерам!
Возник вопрос, как можно ограничить кол-во одновременных соединений к серверу, который работает в режиме stThreadBlocking?
К примеру, если есть 10 активных соединений приостановить TServerAcceptThread, чтобы остальные клиенты даже не пытались подключиться...

И еще вопрос в догонку, может кто-нибудь посоветует некоторые приемы и правила для мало-мальской защиты сервера от DoS атак, и какой код может привести к переполнению буфера (для Си видел полно примеров, а для OP ни одного)?
Заранее всем спасибо.


Digitman   (2005-09-05 15:21:00) [1]


> для TCP нельзя отклонить клиентское соединение само по себе


как раз на уровне ТСР отвержение кл.запроса на соединение и происходит.


> соединение все равно уже установлено


для accept() - да

для WSAAccept() же в логику "переговоров" между клиентом и сервером на этапе установления соединения можно вмешаться, если поддерживается и установлена опция SO_CONDITIONAL_ACCEPT


Evgeny V   (2005-09-05 14:32:00) [2]


> Alexander Panov ©   (05.09.05 13:35) [7]
> Digitman ©   (05.09.05 13:27) [6]
> Вообще, да. Раз автор хочет защититься от переполния ресурсов,
> то так просто не получится.


Вообще я бы проверил если бы было время,  это может быть интересно. В MSDN просто написано, что можно отклонить соединение, но например в книге Оланда и Джонса "Программирование в сетях Windows"  в главе 12 по функции WSAAccept например написано, что для TCP нельзя отклонить клиентское соединение само по себе,соединение все равно
уже установлено и не рекомендуют применять эту функцию - это не мои знания, а приближенный пересказ из главы. Если авторы правы, то вариант с OnAccept будет наверное почти равнозначным по логике работы  -это не утверждение, а скорее вопрос по теме ?

Как вариант для решения такой задачи- опять таки непроверенный, возможно набрав заданное количество соединений, можно просто закрыть listen сокет- это конечно не для варианта TServerSocket.  Но  это сложнее по реализации, чем просто закрыть клиентский сокет, сразу по установлению соединения, как предлагал Panov


sunsay   (2005-09-05 14:12:00) [3]

еще небольшой офф:
Только у меня так невероятно тормозит этот сайт?
Может ребятам с delphimaster.ru есть смысл хостера сменить?


sunsay   (2005-09-05 14:06:00) [4]

В принципе я так и подозревал, что придется "ломать" TServerAcceptThread, так как там по умолчанке: слушаем - создаем поток, слушаем - создаем поток и т.д. Будем исправлять под свои нужды - останавливать accept поток, пока не освободится какой-нить поток общения с клиентом.

Всем спасибо.


Alexander Panov   (2005-09-05 13:35:00) [5]

Digitman ©   (05.09.05 13:27) [6]
Вообще, да. Раз автор хочет защититься от переполния ресурсов, то так просто не получится.


Digitman   (2005-09-05 13:27:00) [6]


> Alexander Panov ©   (05.09.05 13:22) [5]


> обрывать связь


заметь - ужеустановленную связь.
а задача-то сводится к отвержению вновь поступающих запросовна установление связи, а не к обрыву уже установленных соединений.

В моменты OnAccept и OnClientConnect соединение ужеустановлено, т.е. клиент ужеполучил подтверждение успешного коннекта, несмотря на то что сервер через мгновение оборвет его


Alexander Panov   (2005-09-05 13:22:00) [7]

Ну почему нельзя?
МОжно просто воспользоваться событиями OnAccept, OnClientConnect.
По условию обрывать связь.


Digitman   (2005-09-05 08:37:00) [8]


> sunsay ©   (03.09.05 08:37)  


> как можно ограничить кол-во одновременных соединений к серверу


без переделки TServerSocket - никак.


> если есть 10 активных соединений приостановить TServerAcceptThread


в штатном TServerSocket доступа к TServerAcceptThread нет.
да и неразумно такое решение, даже если доступ имелся бы.

для Win2000/ХР для решения такой задачи корректным будет использование механизма true conditional acceptance (условный акцепт вх.запросов на подключение), ключевой момент которого - использование ф-ции WSAAccept вместо ф-ции accept(), которая использует механизм безусловного акцепта и которая задействована в TServerAcceptThread


Slym   (2005-09-05 04:26:00) [9]

протокол:
4 байта длинна, данные, закрытие соединения.

Sock.ReadBuffer(len,4);
SetLength(Str,Len);
while Sock.Read(char,1)>0 then
 Str[pos]:=char;

А данных пришло len+x где с позиции len по x зловредный код


Slym   (2005-09-05 04:20:00) [10]

Обычно Dosят программу бинарник или исходник сервера которой доступен злоумышленнику (чтобы найти уязвимость). Досить "черный ящик" глупо, поскольку пока ты ее DoSищь прога, шайрвол и проч. наберут столько логов что найти, заблокировань или тупо "набить морду" не составит труда


o2   (2005-09-03 22:05:00) [11]

поставь фаервол и не парься


Наверх

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