Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.016 c
14-1132734051
rea
2005-11-23 11:20
2005.12.18
Семинар D2006


1-1132672356
DelphiLexx
2005-11-22 18:12
2005.12.18
Изменить высоту Canvas a


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


14-1132755922
msguns
2005-11-23 17:25
2005.12.18
Как сделать Soft-beholder ?


3-1130749811
alex_1234
2005-10-31 12:10
2005.12.18
D6,ZEOS,MySQL: не работает :-(





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский