![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| TheDestroyer |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2007 Репутация: нет Всего: нет |
Сначала начал делать редирект сам, потом вспомнил, что видел уже это в коде, в итоге оставил как есть в HTTP_SendAns::send_redir, похоже это самый лучший вариант. Проблема была не в редиректе...
А вот проблему с IE и Ajax пока не решил. FF нормально работает, а IE постоянно выдает ошибку "Ошибка c00ce56e." Похоже нашел решение: http://forum.vingrad.ru/forum/topic-237305...t-explorer.html с 4го поста снизу. Идея в том, чтобы выдавать на аякс запрос в кодировке UTF-8. Как перекодировать отправляемый браузеру текст в эту кодировку? С помощью setlocale( LC_ALL, ... )? Это сообщение отредактировал(а) TheDestroyer - 29.6.2009, 00:33 |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Сервер отправляет содержимое строки 'как есть', никаких перекодировок не производится. Что бы это было UTF-8, исходная строка должна быть в UTF-8. Саму строку можно перекодировать чем угодно (например libiconv). Еще надо изменить кодировку в заголовке ответа (об этом уже писал)
|
||||
|
|||||
| TheDestroyer |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2007 Репутация: нет Всего: нет |
Спасибо за наводку на libiconv. Сделал чтобы сервер выдавал текст в UTF-8.
Возникла следующая проблема: если сервер обрабатывает запрос одного пользователя, то второй уже не может зайти на сайт (на данном сервере). Есть режим работы когда пользователю на страницу долго грузится результат работы некоторых приложений, в этом случае на сайт удается зайти только после того, как все операции будут закончены. Т.е. получается что вся работа с сокетом выполняется в одном потоке.
run - функция прослушивания сокета. Как сделать так, чтобы каждому пользователю выделялся свой поток чтобы они могли работать одновременно? Вот функция обработки сокета:
Видимо, надо запускать поток для обработки process_accept(s) для каждого пользователя (а, наверное, правильнее говорить сеанса). Но тут проблема - в одном сеансе множество запросов (текст, картинки и т.д.). Как тут правильно поступить? Также возник вопрос как запустить сервер на определенном адресе, если, например, у компьютера несколько сетевых карт? |
||||
|
|||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Этот сервер намеренно был сделан single thread - для упрощения жизни (не надо связываться с синхронизацией обращений к серверным скриптам и данным для WEB страниц). Кроме того, специфика приложения - это был WEB интерфейс к программе (вместо GUI).
Если нужно многопоточное приложение, то поток надо заводить в методе WEB_Server::process_accept - все его содержимое запускать в потоке. Количество одновременно запущенных потоков можно (и даже нужно) ограничить - например сделать пул нитей, и отдавать запрос в нить из пула. По окончании обработки нить возвращать в пул. Всю синхронизацию придется добавлять (например через критические секции)
Строка 13 в tcp_server.cpp:
|
||||
|
|||||
| TheDestroyer |
|
||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2007 Репутация: нет Всего: нет |
Чтобы добавить многопоточность делаю так:
фаил tcp_server.cpp:
Пытался запустить поток аналогично потоку с обработкой сокета (через RUN_MAIN), но вылезают ошибки о неправильных объявлениях... Тогда решил работать с _beginthread напрямую. К сожалению просто так в функцию, передаваемую в _beginthread параметры не передашь. Да еще эта функция должна быть типа void и иметь параметр типа (void *param) . Примеры смотрел здесь: http://msdn.microsoft.com/en-us/library/kdzttdcb(VS.71).aspx http://www.rsdn.ru/forum/cpp/4612.flat.aspx http://www.gamedev.net/community/forums/to...topic_id=448462 В борланде было проще - указал на запуск функции в отдельном потоке и все функции которые вызываются из нее тоже запускаются в том потоке, и все без преобразования типов передаваемых параметров и т.д. Может и тут так можно? Пришлось сдеделать static функции: фаил web_server.h:
фаил web_server.cpp - добавил функции с _m на конце (multithread) аналогичные их оригиналам. Только, наверное, прийдется им передавать параметры также как и в static void process_accept_m(void *sv). Пока до этого не дошел.
При компиляции ругается на то, что
Здесь это строка 11. Неужели прийдется делать все вызываемые далее функции статическими? Может у меня неправильный подход? Далее, критическими секциями, видимо, прийдется защитить, переменные которые используются в программе глобально? Это сообщение отредактировал(а) TheDestroyer - 30.6.2009, 20:17 |
||||||||
|
|||||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Подход в корне не верный. Обработку надо делать в коде WEB_Server::process_accept
Например так
Далее - все обращения из бывшего WEB_Server::process_accept к общим ресурсам (в первую очередь - поиск и загрузка файлов) должны быть защищены критическими секциями Далее - эта реализация будет создавать по отдельному thread'у на каждый запрос. При большом числе запросов сервер может помереть |
|||
|
||||
| TheDestroyer |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2007 Репутация: нет Всего: нет |
Класс, я замучался с этими потоками. Спасибо огромное.
Если несложно пояснить: здесь добавлена структура RunInfo, в ней есть RunInfo(SOCKET s1, WEB_Server* sl) :s(s1), self(sl) {}. Это инициализация структуры? Похоже на конструктор. По поводу защиты критическими секциями. Видимо при запросе от клиента все сводится к функции void WEB_Server::process_file(HTTP_SendAns &A, string fname). А там либо генерация кода страницы, либо подгрузка файлов из ресурсов. Достаточно ли защитить подгрузку файлов следующим образом: фаил web_server.cpp:
фаил zipfile.cpp:
Пример с критическими секциями смотрел здесь: http://www.cyberguru.ru/programming/cpp/mu...ntro-page2.html В find_resource будут защищены все переменные что во вложенном в нее вызове функции или только одна переменная res? Где лучше объявить CRITICAL_SECTION cs чтобы использовать в файлах zipfile.cpp и web_server.cpp? |
||||
|
|||||
| xvr |
|
||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
В С++ структуры и классы - это одно и то же (отличается только спицификатор доступа по умолчанию - для структуры public, для класса - private). Так что это конструктор и есть
InitializeCriticalSection( &cs ); нужно вынести из WEB_Server::process_accept и поместить куда то на самый верхний уровень - ее нужно вызвать ТОЛЬКО 1 раз до первого использования самой критической секции
(фаил zipfile.cpp):
|
||||||||||
|
|||||||||||
| TheDestroyer |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2007 Репутация: нет Всего: нет |
С многопоточностью вроде разобрался, спасибо.
Обнаружилась проблема: если я передаю GET методом на веб сервер строку типа "qwe%20-qwe%20+qwe", то пропадает знак "+". Стал разбираться, обнаружил:
Чем грозит переключение supp_plus в false? Как правильно обработать этот момент? |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
При кодировании URL пробелы заменяются на знак '+' (HTTP требует). Если нужен пробел лучше передавать его как %31
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |