Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.18;
Скачать: CL | DM;

Вниз

Ограничить кол-во входящих соединений   Найти похожие ветки 

 
sunsay ©   (2005-09-03 08:37) [0]

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

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


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

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


 
Slym ©   (2005-09-05 04:20) [2]

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


 
Slym ©   (2005-09-05 04:26) [3]

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

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

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


 
Digitman ©   (2005-09-05 08:37) [4]


> sunsay ©   (03.09.05 08:37)  


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


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


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


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

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


 
Alexander Panov ©   (2005-09-05 13:22) [5]

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


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


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


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


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

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


 
Alexander Panov ©   (2005-09-05 13:35) [7]

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


 
sunsay ©   (2005-09-05 14:06) [8]

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

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


 
sunsay ©   (2005-09-05 14:12) [9]

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


 
Evgeny V ©   (2005-09-05 14:32) [10]


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


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

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


 
Digitman ©   (2005-09-05 15:21) [11]


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


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


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


для accept() - да

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



Страницы: 1 вся ветка

Текущий архив: 2005.12.18;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.048 c
2-1133600599
coral
2005-12-03 12:03
2005.12.18
Помогите плиз срочно!


14-1133159215
Ega23
2005-11-28 09:26
2005.12.18
С днем рождения! 28 ноября


14-1133021802
Desdechado
2005-11-26 19:16
2005.12.18
Опрос: Уход за рабочим местом


4-1129788953
Владимир
2005-10-20 10:15
2005.12.18
Как программно получить доступ к Event Log


2-1133344255
JTAG
2005-11-30 12:50
2005.12.18
Помогите разобраться с исключительной ситуацией