-
Здравствуйте!
Очень прошу совета :)
Ситуация
---------
Мне нужно на время публичного тестирования организовать сервер лицензирования.
Суть сервера - ему задается вопрос (16 байт), он дает ответ (тоже 16 байт). Суть в том, что вопросов много, ответов много. Без верных ответов программа работать не будет.
Криптования транспорта не требуется - вопросов несколько сот тысяч. За разумное время они не смогут все залогировать и создать эмулятор (а от брутфорса я защищусь).
Сделать мне это нужно за 1 день (за завтра) :)
Что у меня есть
---------------
1. Есть самописный сервер TCP/IP. Он, скотина, медленный так как с серьезным криптованием и обфускацией трафика.
2. Есть функция преобразования (те самые, к которым обращается клиент). Фунция писана на дельфи.
Что хочу
---------
Хочу легковесное решение, которые бы ходило через всякие проксики и пр. Желательно, чтобы не требовало открытия у клиента дополнительный портов (некоторые тестеры будут под ISA и проксями всякими).
Можно (вернее, предпочтительно) HTTP запрос.
Как собираюсь делать
---------------------
Клиент:
На клиенте можно использовать что-то из стандартной библиотеки WinINet (напирмер, HttpOpenRequest, пример видел у Розыча, разберусь, одним словом).
Сервер:
Не знаю :) Нужно быстро за один день наваять простейший HTTP сервер - 16 байт получил, провел вычисление, 16 байт отдал.
Чем лучше реализовать? Посоветуйте, пожалуйста.
-
http протокол + post запросы + шифрование прикладных данных содержащихся в пост запросах
-
> http протокол + post запросы + шифрование прикладных данных
> содержащихся в пост запросах
я эта, как последний студент (кстати, сессия) спрошу - а подробнее можно?
ну типа сервер то чем лучше сделать?
компонент какой?
ЗЫ шифрование не нужно - анализировать трафик смысла нет.
-
Да любой.
тот же TidHTTPServer или TidTCPServer + 10-20 минут писанины по превращаению его в http сервер
-
> компонент какой?
ICS
-
Что же до Indy - с его помощью сделать полноценный сервер (не имя опята в Indy) на порядок сложнее, чем на ICS.
-
э… LAMP+XySSL?
%-)
---
Understanding is not required. Only obedience.
-
В итоге я решил копать ICS. Благо его TWSocketServer активно использую. Т.е. немного в теме.
Вообще евоный THttpServer подмывает своей доступностью: можно писать на дельфи полноценные веб-сервера! (или нельзя, пролейте свет).
Когда я пытался изучать ИНДИ по переводу АП меня не покидало ощущение, что ИНДИ это как-то не очень хорошо. А вот ICS нравится очень.
ВОПРОС.
Кто-нибудь пользует THttpServer серьезно? Сайты создает?
-
> DVM © (15.05.08 21:02)
Ты, я так понял, юзаешь ICS?
Я в THttpServer, видимо, не понял самого главного - как сделать в нем многопоточную работу?
Поясню. Если я должен отдать страницу в событии OnGetDocument, то как сделать так, чтобы несколько клиентов одновременно имели коннект и сервер для каждого клиента формировал свои страницы?
Я понимаю, что в событии OnGetDocument я могу стартануть поток, формирующий страницу. Но как потом ее отдать именно этому клиенту?
Поясни, пожалуйст :)
-
> Тимохов (17.05.08 00:14) [7]
>
> В итоге я решил копать ICS. Благо его TWSocketServer активно
> использую. Т.е. немного в теме.
>
> Вообще евоный THttpServer подмывает своей доступностью:
> можно писать на дельфи полноценные веб-сервера! (или нельзя,
> пролейте свет).
> Когда я пытался изучать ИНДИ по переводу АП меня не покидало
> ощущение, что ИНДИ это как-то не очень хорошо. А вот ICS
> нравится очень.
>
Имхо, это лучший вариант для Дельфи.
-
> Тимохов (17.05.2008 01:09:08) [8]
Самое главное, что потоки ICS просто не нужны, хотя их можно и использовать.
-
> Anatoly Podgoretsky © (17.05.08 01:53) [10]
+1
-
> Anatoly Podgoretsky © (17.05.08 01:53) [10]
ну а все же - как в нем использовать многопоточность?
-
> Тимохов (17.05.08 02:01) [12]
>
>
> > Anatoly Podgoretsky © (17.05.08 01:53) [10]
>
>
> ну а все же - как в нем использовать многопоточность?
>
Дим, а нужно ли в нём использовать многопоточность?
-
> Дим, а нужно ли в нём использовать многопоточность?
Поставь в OnGetDocument sleep(30000) (типа имитация долгого запроса к БД) и все остальные клиенты курят бамбук пока запрос не кончиться.
Поэтому мой ответ - НУЖНО.
-
Это тебе не Инди, для самого ICS потоки не нужно, здесь используется Event Driven Model, ты же не делаешь по одному потоку на каждую кнопку для формы? Ты посмотри примеры, они просветляют. Потоки могут потребоваться для других вещей, например для длительной обработки в базе. А ICS спокойно держит до 30000 одновременных соединений.
Ты просто посторайся мыслить не в парадигме Юникс+Инди, а Windows+Delphi (у ICS таже модель, что и у всей Дельфи). Инди же это чужеродный для Виндоус путь.
-
> ну а все же - как в нем использовать многопоточность?
Как обычно создаешь поток, а в нем все компоненты, тут нет никаких особенностей, а вот проигрыш будет и сложность тоже.
-
Что такое асинхронные неблокирующие сокеты я знаю.
> Anatoly Podgoretsky © (17.05.08 11:19) [16]
> > ну а все же - как в нем использовать многопоточность?Как
> обычно создаешь поток, а в нем все компоненты, тут нет никаких
> особенностей, а вот проигрыш будет и сложность тоже.
Вот смотри. Есть событие OnGetDocument. В нем нужно создать ответ. Пока один запрос не отработает, другой запрос обработан не будет. Так компонент устроен.
Ясное дело, что в OnGetDocument можно запустить поток и все такое.
ВОПРОС. Как по окончании отработки потока отдать клиенту результаты?
ЗЫ Такого примера там нет.
-
Тут суть то вот в чем.
С докой у Пиетта не очень здорово. Некоторые компоненты не описаны.
Видимо после отработки потока можно просто писать их в клиентский сокет?
Типа такого
Client.AnswerString(...)
?
У него доки по такому подходу нет. В примерах я не нашел.
Скажите, пожалуйста, если знаете ICS :)
-
> Тимохов (17.05.2008 20:43:18) [18]
У подавляющего большинстсва OpenSource или Freeware продуктов c документацией полный швах, для ICS пользуйся примерами или из поставки или 3d авторов. Количество просто гигантское.
-
>Тимохов
А почему не захотел использовать обычный Apache?
С ним как раз просто делается всё.
-
> Умище (17.05.08 21:06) [20]
> >ТимоховА почему не захотел использовать обычный Apache?
> С ним как раз просто делается всё.
Да мне все равно :) Просто нужно написать сервер авторизации за завтра :о
Я люблю апач (у меня под ним много чего крутится). Я как-то пытался под него на дельфи писать (фунционал авторизации именно на дельфи). Вроде не разобрался.
Не, напишу, конечно и на своем существующем сервере. Но хочу, чтобы он "косил" под HTTP, чтобы порты не нужно было людям открывать, если из под ISA сидят.
Мне вообще ICS вчера понравился - весь пример OverbyteIcsWebServ изучил. Как таковая многопоточность мне завтра не нужна. Вопрос с многопоточностью возник потому, что я подумал, а не написать ли мне весь свой ВЕБ сервер на ICS? Все равно я хоститься буду только у себя ну или на своем сервере у провайдера. Поэтому мне не нужно PHP и прочие распространенные технологии - я всегда могу поставить win и крутить на нем мой веб сервер на ICS.
-
>[19] Anatoly Podgoretsky © (2008-05-17 20:57:00)
>У подавляющего большинстсва OpenSource или Freeware продуктов c
>документацией полный швах
и зачастую она и не нужна. обычно есть примеры и списки рассылок/форумы.
---
Understanding is not required. Only obedience.
-
> _mirage (17.05.08 21:45) [22]
> >[19] Anatoly Podgoretsky © (2008-05-17 20:57:00)>У подавляющего
> большинстсва OpenSource или Freeware продуктов c>документацией
> полный швахи зачастую она и не нужна. обычно есть примеры
> и списки рассылок/форумы.
сказал бы что-нить по теме, кетмар
-
>[23] Тимохов (2008-05-17 22:14:00)
я в трепологии или где? что я тебе по теме скажу, если я всё время пользовался самописными модулями, а сейчас и вообще второй год винды в глаза не видел?
---
Understanding is not required. Only obedience.
-
> mirage (17.05.08 22:18) [24]
> >[23] Тимохов (2008-05-17 22:14:00)я в трепологии или где?
> что я тебе по теме скажу, если я всё время пользовался
> самописными модулями, а сейчас и вообще второй год винды
> в глаза не виде
ты в прочее :)
да, было дело. видел твой сервер.
в общем на завтра мне полученных знаний и опыта хватит. а там, видно будет - пойму как делать многопоточные сервера на ics.
всем спасибо.
-
>[25] Тимохов (2008-05-17 22:23:00)
>да, было дело. видел твой сервер.
ну, это далеко не лучший образец моего кода. скорее, набор хаков и лапши.
---
Understanding is not required. Only obedience.
-
НЕмного оффтоп, но все же спрошу.
Я вот тут задумал все же написать свой веб сервер на дельфи.
Вопрос от новичка - надо ли RFC2616 (HTTP protocol) читать или есть какие-то более легкие пути все понять?
:)
-
В общем разобрался (мож кому полезно будет, если в историю не успеет уйти).
Для того, чтобы сделать многопоточный сервер из THttpServer нужно:
В евоном событии OnGetDocument:
a) Сказать, что ответ мы сформируем сами посредством
Flags := hgWillSendMySelf;
б) Создать поток, передав ему Client.
в) После выполнения долгой операции в Execute'е потока использовать один из методов AnswerXXX класса THttpConnection (это класс объекта Client, который был упомянут выше).
В общем что-то типа такого (я тут имитирую 10 сек задержку в расчетах и вывожу увеличенную с каждым запросом на 1 глоб. переменную).
type
TMyThread = class(TThread)
public var Cl : TMyHttpConnection;
procedure Execute(); override;
end;
var
GlogalCounter: integer = 123;
procedure TMyThread.Execute();
var
Dummy: THttpGetFlag;
begin
Sleep(10000);
Inc(GlogalCounter);
Cl.AnswerString(Dummy,
'',
'',
'Pragma: no-cache' + #13#10 +
'Expires: -1' + #13#10,
'<HTML>' +
'<BODY>' +
inttostr(GlogalCounter)+
'</BODY>' +
'</HTML>');
end;
procedure TWebServForm.HttpServer1GetDocument(Sender: TObject;
ClientCnx: TMyHttpConnection; var Flags: THttpGetFlag);
begin
with TMyThread.Create(True) do
begin
FreeOnTerminate := True;
Cl := ClientCnx;
Resume();
end;
Flags := hgWillSendMySelf;
end;
В общем работает.
--------------
Книгу Оланда "Программирование в сетях Windows" никто не продаст? :)
-
> Тимохов (17.05.08 23:52) [27]
> НЕмного оффтоп, но все же спрошу.
>
> Я вот тут задумал все же написать свой веб сервер на дельфи.
>
Я вот натыкался на весьма неплохо написанный WEB сервер от создателей TheBat: TinyWEB. Он использует потоки. Написан понятно. Можешь с подражания ему начать.
http://www.ritlabs.com/en/products/tinyweb/
-
В догонку к [29]: само собой он на Delphi написан.
-
> DVM © (18.05.08 00:15) [29]
угу, спасибо, посмотрю.
---------
есть в вебе что-то такое гадостное.
я вот тут обнаружил, что страничку, писанную мной в 2000 году для моей работы, до сих пор корректно воспринимают все браузеры, хотя в ней есть реальные колапсы с DIVами и TABLEами (нет закрывающий, у таблицы ряды не всегда верно проставелены).
я вот привык, что если в одном бите лажанул - то получи гранату в виде AV. а тут - сплошное додумывание за меня :) ладно, это лирика.
ВОПРОС. Знает ли кто-то хороший фреймворк для разработки веб приложений под дельфи? Может RAILS перетащили на DELPHI?
-
> Тимохов (18.05.08 00:29) [31]
> я вот привык, что если в одном бите лажанул - то получи
> гранату в виде AV
Тогда пиши свой веб-сервер на Си (без плюсов). После Delphi на нем так "удобно и легко" програмировать работу со строками. Просто сказка. :) Шаг влево, шаг вправо и получаем полнейший бардак в работе программы и диковинные глюки :)
-
> Тогда пиши свой веб-сервер на Си (без плюсов). После Delphi
> на нем так "удобно и легко" програмировать работу со строками.
> Просто сказка. :) Шаг влево, шаг вправо и получаем полнейший
> бардак в работе программы и диковинные глюки :)
да не хочу я свое писать. хочу оболочку, в которой я бы смог развенуться :)
лан, ICS мой выбор (пока). о результатах доложу :)
-
>[32] DVM © (2008-05-18 00:38:00)
вполне нормально. один раз сделал библиотеку для динамических строк — и забыл навсегда. это ж макроассемблер: взял и допилил.
---
Understanding is not required. Only obedience.
-
> _mirage (18.05.2008 17:12:34) [34]
Не понимают они мощи макроассемблера, не понимают.
-
>[35] Anatoly Podgoretsky © (2008-05-18 17:42:00)
вот-вот. си и FOSS — наше всё. в FOSS принцип «не хватает — допиши», и в си то же самое. в FOSS принцип «фигню дал — фигню получил», и в си то же самое.
так-то.
---
Understanding is not required. Only obedience.