![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| TheDestroyer |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2007 Репутация: нет Всего: нет |
Продолжаю разбирать пример xvr:
На сколько я понял web_server.h и web_server.cpp - реализация поддержки http протокола, tcp_server.h и tcp_server.cpp - реализация сокетов и многопоточности. То, чего нехватает (лишнее) - убрал из StdAfx.cpp (класс InitSeqBuilder), остальное в utils пока не мешает, уберу позже. Проблему с нераспознанием типа решил установкой #include <winsock2.h> перед #include <windows.h> в utils.h Теперь много ошибок при компиляции типа:
т.е. не принимает функции setsockopt, listen,... Как это поправить? Еще несколько вопросов: 1. Что описывает класс HTTP_SendAns? Его функции вижу, а как это одним словом называется не пойму.. 2. Что означает последний параметр в функции send_file_data(d,find_file_type(get_file_ext(fname)),false); ? Похоже, что в хэдер будет добавлено Last-Modified: %s. Last-Modified — время последнего изменения пересылаемых данных. В каком случае это может пригодиться? 3. Мой сайт построен так, что он состоит не из отдельных html страничек, а из php файлов, которые выдают информацию на страницу в зависимости от запросов пользователя. Используется довольно много Javascript и Ajax. В данном случае вместо php используется C++. Вопрос: место куда лучше вставить динамическую генерацию кода страничек этоHTTP_SendAns::send_file1(string fname) ? Т.к. там string d=find_resource("web\\"+fname); в переменной d, как я понял хранится код странички, которую сервер отошлет пользователю. Получается здесь надо вставить мою функцию, которая будет динамически создавать сожержимое страницы. Но для генерации этого содержимого надо знать переменные POST и GET запросов, хорошо бы знать cookies для идентификации пользователя (как сессии в php) и хранения некоторых его переменных. В каком месте доступны эти переменные ( POST и GET запросов) и есть ли здесь реализация cookies? Это сообщение отредактировал(а) TheDestroyer - 21.5.2009, 00:29 |
|||
|
||||
| Andrey44 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 2 Всего: 26 |
-------------------- ????? ??, ??????? ?????. |
||||
|
|||||
| xvr |
|
||||||||||||||||||||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Угу
Занимается этим функция void send_asp(HTTP_SendAns &A, string s);, но она в эти исходники не входит. Поддержка JS довольно сильно переплетена с остальной частью программы, если надо, могу попробовать ее оторвать
Переменные и методы в нем:
|
||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||
| TheDestroyer |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2007 Репутация: нет Всего: нет |
Спасибо за ответы.
Удалось скомпилировать консольное приложение, поставив заглушки на недостающие функции, прилинковав Ws2_32.lib и создав главную функцию int _tmain(int argc, _TCHAR* argv[]) в web_server.cpp Пытаюсь запустить сервер, делаю так:
Как правильно инициализировать и запустить веб сервер? Функцию find_resource сделал такой, чтобы хоть что-то вывело клиенту:
Как JavaScript поддерживается на стороне сервера? |
||||
|
|||||
| xvr |
|
||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
web_server.do_init достаточно - он запускает run в нитке. (Макросы MAIN_FUNC и RUN_MAIN из StdAfx.h) После do_init нужно повиснуть (например в for(;;) Sleep(1000);}. Или крутить цикл оконных сообщений, или что нибудь еще
|
||||||||||
|
|||||||||||
| TheDestroyer |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2007 Репутация: нет Всего: нет |
А что может делать JavaScript на стороне сервера? Удалось получить тестовую строку на клиенте!
Похоже, это та часть, которую надо будет менять для компиляции этого исходника под linux? Разбираюсь с переменными, которые присылаются на сервер через GET и POST запросы. Поставил такой html код на выдачу клиенту:
Не удается получить значения переменных param1, param2. Как их правильно получить? A.req.get_cgi не возвращает эти параметры. a1,a2 или a3 передаются в A.req.cgi_lines[1], т.е. все параметры с формы будут всегда в A.req.cgi_lines ? |
||||
|
|||||
| xvr |
|
||||||||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Формировать из .asp html
Угу, у моего сервера main выглядит так:
|
||||||||||||||||
|
|||||||||||||||||
| TheDestroyer |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2007 Репутация: нет Всего: нет |
Да, помимо опечатки, еще идея неверная была. Теперь клиенту отправляется это:
Пытаюсь через A.req.get_cgi получить значения переданных параметров: В A.req.get_cgi(); надо передавать string id, а что это за id и как его получить? Если докопать до "корня" этой функции, то видно, что производится операция
Похоже, что создается список в виде "параметр, значение". Поясните, плз, что тут происходит и как правильно получить параметр 'answer' со значением 'a1', 'a2' или 'a3', в зависимости от того, что выбрал пользователь на странице. Или для получения параметров, переданных через GET запрос в адресе после знака "?" (handler.php?param1=123¶m2=321). Также если параметров несколько , то хотелось бы получить их все в переменные (как в php). Похоже, что надо узнать сколько их через A.req.cgi_lines.size и в цикле for присвоить соответствующим переменным их значения? Получается все переданные параметры со своими значениями будут храниться в A.req.cgi_lines независимо от того, как они были приняты через POST или GET? (возможно передавть POST и GET одновременно некорректно...) Это сообщение отредактировал(а) TheDestroyer - 24.5.2009, 19:39 |
||||
|
|||||
| xvr |
|
||||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Их надо знать. Предполагается, что вы сами формировали формы, которые клиент отправил вам, так что параметры вам должны быть известны
|
||||||||||||
|
|||||||||||||
| TheDestroyer |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2007 Репутация: нет Всего: нет |
Спасибо, с GET и POST ясно.
Разбираюсь с Cookies. Следуя Делаю так: для записи cookies пока для тестов в функции string HTTP_SendAns::send_file1(string fname) ставлю:
в функции void WEB_Server::process_file(HTTP_SendAns &A, string fname) Пишу:
Хочу прочитать записанное, на форме из предыдущего примера жму Submit или просто обновляю страницу. К сожалению, возвращается пустое значение. Смотрю в папке Cookies браузера (IE), созданных мной cookies там нет :(. Если заходить на данный веб сервер через FireFox, то в его cookies запись появляется. Но несмотря на это, считывание cookies при повторном заходе на страницу не происходит. Что тут может быть не так? Возможно, в IE проблема с синтаксисом самой записи, может необходимо указывать expires=... Как правильно получить cookies? Хорошо бы устанавливать время жизни cookies. Как получить текущее время + 30мин или +1 день с помощью функции print_time() ? Для записи cookies планирую сделать функцию в классе HTTP_SendAns: HTTP_SendAns::SetCookie(string item, string value). Также, получать параметры переданные через GET и POST, записывать и читать cookies надо в функции динамического формирования странички. Сейчас это функция string find_resource(string name) в файле StdAfx.cpp. Как лучше сделать доступными A.req.get_cgi("..."), A.req.get_hdr("Cookies") и SetCookie(...) в find_resource()? |
||||
|
|||||
| xvr |
|
||||||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Cookie привязываются к URL (точнее имени сервера), откуда была полученна страница. Возможно IE хочет увидеть этот URL где то явно (в записях заголовка или атрибуте Path), точно не знаю
А функция для формирования ответа, это WEB_Server::process_file, туда и надо вставлять генерацию динамического контента Кроме того, есть специальная функция для обработки управляющих запросов - WEB_Server::process_cmd (она сейчас пустая) |
||||||||||||||
|
|||||||||||||||
| TheDestroyer |
|
||||||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2007 Репутация: нет Всего: нет |
Пытаюсь динамически сгенерировать страницу. Делаю это так:
Для проверки того, что получается при отправке и приеме сниффером (WireShark) проверяю запросы. Выявил странность: через браузер делаю запрос на сервер, сервер отвечает не одним пакетом, а двумя сначала
Проверил аналогичный запрос на сервер Apache, он отвечает одним пакетом
Возможно проблема с cookies из-за этого. UPDATE: Нет, похоже это не проблема, да отсылка идет по частям, но это не влияет на процесс. Удалось передать cookies следующим образом:
А принять так:
В итоге в str2 строка со значениями через точку с запятой. Похоже остется разделить их в переменные или массив для дальнейшей работы с ними. Для получения времени пришлось переместить функцию print_time в классе Http_SendAns из private в public Это сообщение отредактировал(а) TheDestroyer - 26.5.2009, 13:34 |
||||||||||||
|
|||||||||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
|
|||
|
||||
| TheDestroyer |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2007 Репутация: нет Всего: нет |
Сделал установку и получение cookies. В итоге появились функции
может пригодятся. Получать cookies точно также как и get_cgi или get_hdr. В процессе добавления поддержки cookies выявил некорректную работу функции trim в StdAfx.cpp, пришлось заменить
Вроде теперь есть все инструменты для создания сайта. Но теперь встал вопрос о том, как добавить большие фрагменты JavaScript кода в фаил веб сервера. Просто вбивать их строковыми переменными явно неправильно. Хотелось бы просто загружать в строковую переменную содержимое .js файла и использовать ее. Как сделать так, чтобы JavaScript код был в отдельном .js файле для его удобного редактирования до комптляции и чтобы после компиляции все упаковывалось в один фаил? Такойже вопрос и с картинками для сайта. |
||||
|
|||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Спасибо, пригодится
Чуть не забыл - для работы этой функции нужно прилинковать zlib Это сообщение отредактировал(а) xvr - 26.5.2009, 22:54 Присоединённый файл ( Кол-во скачиваний: 4 )
zipfile.zip 3,78 Kb |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |