PHP与C ++应用程序的通信

时间:2010-10-26 05:51:11

标签: php c++ sockets

我一直在搜索谷歌一段时间,但我遇到的问题是我不确定我需要搜索的是什么。 (搜索PHP C ++通信似乎不是我需要的)我基本上是为游戏服务器开发一个c ++插件,我想创建一个可以向/从C ++插件传递数据的Web界面。游戏已经使用RCON端口进行远程管理访问,但我偶然发现了他们使用的网络接口的标题,所以我想我可以使用它。

我的问题是我对使用套接字不是很熟悉。我假设我基本上需要在C ++中打开一个套接字并让它监听,然后在PHP中,连接到该套接字,传递数据并关闭它。

这是界面...... http://www.ampaste.net/m2f6b6dbc

我大部分时间都会像当前连接的玩家名单,名字和分数那样提取信息。并传递命令以重新启动服务器,关闭它等等。

任何帮助都会很棒,谢谢!

5 个答案:

答案 0 :(得分:5)

你可以试试Thrift。它是由Facebook的工程师编写的,现在它是一个Apache项目。

Thrift是可扩展的跨语言服务开发的软件框架。它将软件堆栈与代码生成引擎相结合,以构建在C ++,Java,Python,PHP,Ruby,Erlang,Perl,Haskell,C#,Cocoa,Smalltalk和OCaml之间高效无缝工作的服务。

链接:http://incubator.apache.org/thrift/

简而言之,它完全符合您的要求。它使不同语言可以轻松地相互通信。您可以在PHP中调用函数,而不是试图提出一些基于套接字的通信协议:

$game->getScores();

它会自动插入到C / C ++程序中名为getScores的函数中。唯一的缺点是配置正确可能有点痛苦。

答案 1 :(得分:3)

我敢于建议使用一些标准的分布式组件通信方式,例如XML RPC。 PHP和C ++都有库:http://en.wikipedia.org/wiki/XML-RPC#Implementations

这种方法可以防止您在通信协议实施过程中重新发明轮子,并且可以进一步降低维护成本。

答案 2 :(得分:3)

  

我假设我基本上需要在C ++中打开一个套接字并让它继续监听

是的,是的,这就是我给我12岁女儿的描述 - 但如果你要让一个以上的客户连接其中更多的参与者。特别是如果您将代码固定到现有服务器上。所以请阅读socket programming FAQ

您确实需要定义在套接字上传输时如何表示数据的协议。这些都是很多'标准方法 - 但有时像CORBA / SOAP等东西可能比从头开始一样过度和努力。

如果您正在使用现有服务器上的代码,那么如果您使用当前套接字并在必要时扩展协议,生活将变得更加简单。

编写套接字服务器有3种模式 - 您提供的代码片段似乎不包含您当前使用的详细信息:

  1. 分叉服务器(可以拆分线程而不是进程)
  2. 单线程服务器
  3. 无套接字服务器
  4. 分叉服务器

    • 启动服务器实例(称之为p1),调用setsid()
    • p1开始侦听相关套接字
    • 客户端尝试连接
    • p1 forks to create p2
    • p2然后接受连接并开始与客户端交谈
    • p1继续倾听进一步的联系
    • 连接关闭时
    • p2退出

    这有变化 - p2可能接受进一步的连接,p1可能在连接进入之前进行分叉)

    单线程

    • 启动服务器实例,调用setsid()
    • 它开始侦听连接,并创建一个正在使用的套接字数组(包括初始套接字)
    • socket_select()用于标识来自任何套接字的活动
    • 当客户端连接时,接受连接并将其添加到连接数组
    • 每当socket_select()在其中一个套接字上返回活动时,服务器就会生成相应的响应/关闭套接字/绑定新连接

    无套接字服务器

    • 某个进程(例如inetd)处理所有套接字内容
    • 当客户端连接时,此其他服务器启动程序实例并将套接字I / O绑定到程序的STDIN / STDOUT
    • 当你的程序退出时,另一个进程关闭套接字(如果它仍然打开)并处理清理(例如,如果它被实现为分叉服务器,那么生成的进程可能会结束)

答案 3 :(得分:0)

你想要谷歌的东西是C ++客户端/服务器。我可以在这里建议两种方法。

首先,将创建一个非常基本的HTTP协议服务器,以便您的php脚本可以简单地转到http://yourip/并通过POST变量发送命令。您可以在https://stackoverflow.com/questions/175507/c-c-web-server-library

找到C ++ Web服务器的示例

允许更多灵活性的第二种方法是构建自己的基本协议,并使用PHP的SOCKETS连接到服务器并发送命令。您可以在http://www.codeproject.com/KB/IP/client_server_socket.aspx找到C ++客户端/服务器应用程序的示例。请记住,对于C ++端,您只关心服务器部分。您可以使用套接字在PHP中找到基本的PING客户端,位于以下URL:http://www.planet-source-code.com/vb/scripts/ShowCode.asp?lngWId=8&txtCodeId=1786。还有一些类可以处理大部分协议部分,但我不知道这两种语言都有用。

请注意我没有测试过我链接的任何代码。我只是在google上找到了它们。

答案 4 :(得分:0)

一个好的起点是http://php.net/manual/en/book.sockets.php

基本上,您将为PHP创建另一个远程管理端口和方法。当然,如果您只接受来自一个IP的Web通信,那么这是保护它的好方法(检查并允许仅访问将连接的一个IP)。但是,您需要C ++服务器监听(安全?)端口并让PHP连接到它(只要主机允许它)。

总的来说,如果你已经有一台服务器在运行,那么从C ++方面来看应该很简单。从PHP方面你需要做的就是研究连接到不同的服务器并传递信息(PHP能够有效地完成这些工作)

但是,这显然是海报的替代品2.我个人喜欢(在很多情况下)“重新发明轮子”,以便能够管理我自己的工作。但是,当然,这并不总是因成本或其他原因而有效。

祝你好运!