Связь PHP с приложением C ++ - PullRequest
9 голосов
/ 26 октября 2010

Я некоторое время искал в Google, но проблема, с которой я столкнулся, заключается в том, что я не совсем уверен, что именно мне нужно искать.(Похоже, поиск PHP C ++ не является тем, что мне нужно) Я в основном разрабатываю плагин c ++ для игрового сервера, и я хотел бы создать веб-интерфейс, который может передавать / извлекать данные в плагин C ++ и из него.В игре уже используется порт RCON для удаленного административного доступа, но я наткнулся на заголовок сетевого интерфейса, который они используют, поэтому я предполагаю, что мог бы использовать это.

Моя проблема в том, что я не очень знаком с использованием сокетов,Я предполагаю, что в основном мне нужно будет открыть сокет в C ++ и оставить его слушающим, а затем в PHP подключиться к этому сокету, передать данные и закрыть его.

Вот интерфейс ... http://www.ampaste.net/m2f6b6dbc

В основном я собираюсь получить информацию, такую ​​как текущий список подключенных игроков, имена и оценки.И передача команд для перезапуска сервера, его выключения и т. Д.

Любая помощь будет отличной, спасибо!

Ответы [ 5 ]

5 голосов
/ 26 октября 2010

Вы можете попробовать Thrift. Он был написан инженерами в Facebook, и теперь это проект Apache.

Thrift - это программная структура для разработки масштабируемых кросс-языковых сервисов. Он объединяет программный стек с механизмом генерации кода для создания сервисов, которые работают эффективно и без проблем между C ++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C #, Cocoa, Smalltalk и OCaml.

Ссылка: http://incubator.apache.org/thrift/

В двух словах, он делает именно то, что вы пытаетесь сделать. Это позволяет различным языкам общаться друг с другом. Вместо того, чтобы пытаться придумать какой-то сокетный протокол для связи, вы можете вызвать функцию в PHP следующим образом:

$game->getScores();

И он автоматически подключается к функции getScores в вашей программе C / C ++. Единственный недостаток в том, что правильно настроить может быть немного сложно.

3 голосов
/ 26 октября 2010

Полагаю, мне нужно будет открыть сокет в C ++ и оставить его слушать

О, да, это описание, которое я бы дал своей 12-летней дочери -но если вы собираетесь подключить более одного клиента, это немного более сложно.Особенно, если вы прикрепляете код к существующему серверу.Так что прочитайте FAQ по программированию сокетов .

Вам необходимо определить протокол представления данных при перемещении через сокет.Существует множество «стандартных методов», но иногда такие вещи, как CORBA / SOAP и т. Д., Могут быть просто излишними и требовать больших усилий, чем начинать с нуля.

Если вы используете код на существующем сервере, жизнь будет намного прощеесли вы используете текущий сокет и при необходимости расширяете протокол.

Существует три модели написания сервера сокетов - предоставленный вами фрагмент кода, похоже, не содержит подробностей, с которыми вы сейчас работаете:

  1. сервер разветвления (может разделять потоки, а не процессы)
  2. однопоточный сервер
  3. сервер без сокетов

сервер разветвления

  • Запускается экземпляр сервера (назовите его p1), вызывая setsid ()
  • p1 начинает прослушивать соответствующий сокет
  • , клиент пытается подключиться
  • p1 разветвляется для создания p2
  • p2, затем принимает соединение и начинает разговор с клиентом
  • p1 продолжает прослушивать дальнейшие соединения
  • p2 завершается, когда соединение закрывается

Существуют варианты этого - p2 может принимать дальнейшие соединения, p1 может быть разветвлен до входа в соединение)

single-thread

  • Экземпляр сервера запускается, вызывая setsid ()
  • , он начинает прослушивать соединение и создает массив используемых сокетов (включая исходный)
  • socket_select () используется для идентификации активности любого из сокетов
  • при подключении клиента, соединение принимается и добавляется в массив соединений
  • всякий раз, когда socket_select () возвращает активность на одном из сокетов, сервер генерирует соответствующий ответ / закрывает сокет / связывает новое соединение

сервер без сокетов

  • некоторый процесс (например, inetd)обрабатывает все сокеты
  • при подключении клиента, этот другой сервер запускает экземпляр вашей программы и связывает сокет ввода-вывода с STDIN / STDOUT вашегоур программа
  • при выходе из программы другой процесс закрывает сокет (если он все еще открыт) и обрабатывает очистку (например, если он реализован как сервер разветвления, то порожденный процесс может завершиться)
3 голосов
/ 26 октября 2010

Я бы осмелился рекомендовать использовать некоторые стандартные средства связи распределенных компонентов, например, XML RPC.Существуют библиотеки как для PHP, так и для C ++: http://en.wikipedia.org/wiki/XML-RPC#Implementations

Этот подход не позволит вам заново изобретать колесо во время реализации протокола связи и сделает дальнейшее обслуживание более дешевым.

0 голосов
/ 26 октября 2010

Хорошее место для начала было бы http://php.net/manual/en/book.sockets.php.

По сути, вы собираетесь создать еще один порт удаленного администрирования и метод для подключения PHP.Естественно, если вы собираетесь принимать веб-сообщения только с одного IP-адреса, это хороший способ защитить его (проверьте и разрешите доступ только к одному IP-адресу, который будет подключаться).Однако вам понадобится сервер C ++ для прослушивания (защищенного?) Порта и подключения к нему PHP (если хост позволяет это).

В общем, если у вас уже работает сервер, этодолжно быть просто со стороны C ++.Все, что вам нужно сделать со стороны PHP, - это действительно исследовать соединение с различными серверами и передавать информацию (что PHP более чем способен сделать эффективно)

Но это, очевидно, альтернатива постеру 2.Мне лично нравится (во многих случаях), так сказать, «изобретать велосипед», чтобы иметь возможность управлять своей работой.Но, конечно, это не всегда эффективно по стоимости или по-другому.

Удачи!

0 голосов
/ 26 октября 2010

Похоже, вы хотите, чтобы Google является C ++ клиент / сервер. Здесь я могу предложить два подхода.

Во-первых, нужно создать очень простой сервер протокола HTTP, чтобы ваш php-скрипт мог просто перейти на http://yourip/ и отправить ваши команды через переменные POST. Вы можете найти пример веб-сервера C ++ по адресу: https://stackoverflow.com/questions/175507/c-c-web-server-library

Второй подход, который обеспечивает гораздо большую гибкость, - это создать свой собственный базовый протокол и использовать СОКЕТЫ PHP для подключения к серверу и отправки команд. Вы можете найти пример клиент / серверного приложения C ++ по адресу http://www.codeproject.com/KB/IP/client_server_socket.aspx. Имейте в виду, что для конца C ++ вас интересует только серверная часть. Вы можете найти базовый клиент PING в PHP, используя сокеты, по следующему URL: http://www.planet -source-code.com / vb / scripts / ShowCode.asp? LngWId = 8 & txtCodeId = 1786 . Существуют также классы для обработки большей части протокольной части, хотя я не знаю ни одного, который бы работал на обоих языках.

Обратите внимание, что я не проверял ни один из кодов, на которые я ссылался. Я просто нашел их в Google.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...