Текущий архив: 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.47 MB
Время: 0.012 c