PHP-связь с C ++-приложением

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

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

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

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

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

Вы могли бы попробовать Трэйфт. Это было написано инженерами в 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 ++. Единственный недостаток – это может быть немного больно для правильной настройки.

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

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

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

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

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

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

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

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

сервер forking

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

Есть вариации этого – p2 может принимать дальнейшие соединения, p1 может развиваться до подключения)

однопоточных

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

бессетевой сервер

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

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

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

Второй подход, который обеспечивает большую гибкость, составляет ваш собственный базовый протокол и использует SOCKETS для подключения к серверу и отправки команд. Вы можете найти пример клиентского / серверного приложения 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.

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

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

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

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

Удачи!