На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Как связать самописный сервер на С++ и Apache-php на одном 80м порту?
      Имеется самописный сервер на C++, умеющий отвечать на запросы в json - в этом состоит его основной функционал (отдаёт обновления чата). Основную веб-морду он пока отдаёт тоже сам (в виде html-страничек с js-скриптами, которые через ajax запрашивают обновления чата). Схема работает, но получается что весь бэкэнд я вынужден писать на плюсах, а это, мягко говоря, плохо расширяемая архитектура. Хочется подключить, скажем, apache c php, куда можно поставить готовые CMS (например WordPress); а выход на мой чат был бы только одной из страничек его сайта.

      Ну т.е. хотелось бы организовать что-то вроде такого:
      mysite.ru/wp/index.php - отдаёт обычный сайт на php
      mysite.ru/chat/?p1=v1&v1=v2 - отдаёт ответы от моего cpp-шного сервера.

      В принципе проблема легко бы решалась, если бы php-шный сайт работал себе на привычном 80м порту, а cpp-шный сервер - на каком-нибудь другом. Но мне хочется чтобы всё делалось на 80м (другие порты ведь у пользователя могут быть закрыты - на работе злым админом, дома - роутером, который далеко не все умеют настраивать).

      Пока есть мысли о связке через fastCGI, модули к php или тупо через php-socket (последний вариант уже пробовал, но напрягает создание отдельного php-интерпретатора на каждый запрос пользователя; а ведь в чате это long-pooling, т.е. созданный процесс не просто отработал и умер, а ждёт обновления чата до 15 секунд; собственно из за этого я и перешёл на c++).
      Или ситуация решается ещё проще, как-то через настройку htaccess?

      Подскажите, в какую сторону копать?
      (отказ от ядра на C++ не предлагать, мне нужно понять, как сделать ему веб-интерфейс и подружить с php).


      P.S. Вопрос размещаю в ветках форума и про C++, и про HTTP сервера, не знаю кого он больше касается (если всё сводится к настройке htaccess, то ко второму, а если нет - то к более "увлекательному" первому).
          Цитата Dark Alf @
          P.S. Вопрос размещаю в ветках форума и про C++, и про HTTP сервера, не знаю кого он больше касается (если всё сводится к настройке htaccess, то ко второму, а если нет - то к более "увлекательному" первому).

          Почему то есть предчувстие, что к сетевому программированию проблема имеет весьма отдаленное отношение, если вообще никакого. :)
            Dark Alf, можно так сделать: твой самописный сервер получает запрос, парсит его и смотрит что это такое, если чат, то обрабатывает на месте и отдает ответ, иначе отправляет весь запрос в сыром виде на порт apache, получает от него ответ и также в сыром виде возвращает пользователю.
              Или настроить форвардинг на разные порты, в зависимости от адреса. Один порт отдать под апач, другой под сервер на плюсах.
                Ну дык 2 разных Location и всё.
                  Цитата Dark Alf @
                  обновления чата до 15 секунд;

                  Какой такой смысл движку чата держать свой порт и соединение???

                  1) Фрэйм чата может сам самостоятельно обновляться средствами тегов HTML, либо JavaScript
                  2) Запросив обновление, читается таблица БД чата (средствами PHP), чат обновляется
                  3) В случае необходимости внесения новых постов в БД чата, это вполне решается на средствами PHP

                  Каким боком тут C++???

                  Если хочется организовать нечто типа push-сервера (а не обновления в 15 сек), PHP должен держать канал самостоятельно, периодически вызывая прогу на C++ для обработки данных. Но если честно, немного непонятно ТЗ, какие именно требования к чату?
                  Сообщение отредактировано: JoeUser -
                    Цитата
                    Как связать самописный сервер на С++ и Apache-php на одном 80м порту?

                    Это решение не подходит для коммерческого кода. Читайте GoF.
                      skrambun
                      M
                      Отвечать следует по сути вопроса :)
                        Если линукс, то есть такая опция: SO_REUSEADDR
                        можно попытаться на неё взглянуть, но я вижу только если 2 идентичных процесса на него смотрят. Если какая то разница есть в работе 2-х процессов, то больше русскую рулетку напоминать начинает :)

                        Добавлено
                        Цитата
                        Dark Alf, можно так сделать: твой самописный сервер получает запрос, парсит его и смотрит что это такое, если чат, то обрабатывает на месте и отдает ответ, иначе отправляет весь запрос в сыром виде на порт apache, получает от него ответ и также в сыром виде возвращает пользователю.

                        Да, скорее всего даже так. Они правда будут на разных портах, но конечному пользователю какая разница если все работает и прозрачно.
                          Цитата Бобёр @
                          Если линукс, то есть такая опция: SO_REUSEADDR

                          Пожалуй, это самая мифологизированная опция :D

                          Шарить один и тот же порт можно будет только для UDP. В случае TCP это лишь ускорит cooldown после освобождения порта, что полезно для высоконагруженных серверов.
                            Цитата Dark Alf @
                            Имеется самописный сервер на C++, умеющий отвечать на запросы в json - в этом состоит его основной функционал (отдаёт обновления чата). Основную веб-морду он пока отдаёт тоже сам (в виде html-страничек с js-скриптами, которые через ajax запрашивают обновления чата). Схема работает, но получается что весь бэкэнд я вынужден писать на плюсах, а это, мягко говоря, плохо расширяемая архитектура. Хочется подключить, скажем, apache c php, куда можно поставить готовые CMS (например WordPress); а выход на мой чат был бы только одной из страничек его сайта.

                            Ну т.е. хотелось бы организовать что-то вроде такого:
                            mysite.ru/wp/index.php - отдаёт обычный сайт на php
                            mysite.ru/chat/?p1=v1&v1=v2 - отдаёт ответы от моего cpp-шного сервера.

                            В принципе проблема легко бы решалась, если бы php-шный сайт работал себе на привычном 80м порту, а cpp-шный сервер - на каком-нибудь другом. Но мне хочется чтобы всё делалось на 80м (другие порты ведь у пользователя могут быть закрыты - на работе злым админом, дома - роутером, который далеко не все умеют настраивать).

                            Пока есть мысли о связке через fastCGI, модули к php или тупо через php-socket (последний вариант уже пробовал, но напрягает создание отдельного php-интерпретатора на каждый запрос пользователя; а ведь в чате это long-pooling, т.е. созданный процесс не просто отработал и умер, а ждёт обновления чата до 15 секунд; собственно из за этого я и перешёл на c++).
                            Или ситуация решается ещё проще, как-то через настройку htaccess?

                            Подскажите, в какую сторону копать?
                            (отказ от ядра на C++ не предлагать, мне нужно понять, как сделать ему веб-интерфейс и подружить с php).


                            P.S. Вопрос размещаю в ветках форума и про C++, и про HTTP сервера, не знаю кого он больше касается (если всё сводится к настройке htaccess, то ко второму, а если нет - то к более "увлекательному" первому).

                            Предлагаю написать на C++ программу сервер для работы на 80 tcp порту.

                            1. Программа должна выполнять роль сервера для браузера пользователя и роль клиента для программ на удалённых машинах (например на Hyper-V) работающих на 80 порту каждая на своей машине.
                            2. Программа рассматривает запросы и отправляет на нужную удалённую машину на 80 порт. Получает ответ сервера и пересылает ответ своему клиенту (браузеру пользователя).

                            Фактически программа выполняет роль посредника. По такому принципу работают все маршрутизаторы и всё остальное.
                            При этом удалённые машины могут находится вне прямого доступа для браузера пользователя, например в локальной сети или в другом конце Мира, на том же Hyper-V сервере или в другой Галактике соединение с которой сервером настроено через маршрут к сети на интерфейсе VPN-соединения на маршрутизаторе.
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0324 ]   [ 16 queries used ]   [ Generated: 25.04.24, 04:12 GMT ]