【问题标题】:PHP Communication with C++ ApplicationPHP 与 C++ 应用程序的通信
【发布时间】:2011-04-30 13:54:16
【问题描述】:

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

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

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

我主要只是要提取当前连接球员名单、姓名和分数等信息。并传递命令以重新启动服务器,将其关闭等。

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

【问题讨论】:

    标签: php c++ sockets


    【解决方案1】:

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

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

    您确实需要定义数据在通过套接字传输时如何表示的协议。有很多“标准方法”——但有时像 CORBA / SOAP 之类的东西可能只是矫枉过正,而且比从头开始需要更多的努力。

    如果您在现有服务器上使用螺栓连接代码,那么如果您使用当前套接字并在必要时扩展协议,生活将会简单得多。

    编写套接字服务器有 3 种模型 - 您提供的代码 sn-p 似乎没有包含您当前正在使用的详细信息:

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

    分叉服务器

    • 服务器实例已启动(称为 p1),调用 setsid()
    • p1 开始监听相关套接字
    • 客户端尝试连接
    • p1 分叉创建 p2
    • p2 然后接受连接并开始与客户端对话
    • p1 继续侦听更多连接
    • p2 在连接关闭时退出

    这有一些变化 - p2 可能会接受进一步的连接,p1 可能会在连接到来之前分叉)

    单线程

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

    无套接字服务器

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

    【讨论】:

    • 这是一个很酷的介绍性解释!现在,如果我能把我 12 岁的女孩的大脑包裹在多线程的概念上……
    【解决方案2】:

    你可以试试 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 的函数中。唯一的缺点是正确配置可能有点麻烦。

    【讨论】:

      【解决方案3】:

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

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

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

      但是,这显然是海报 up 2 的替代方案。我个人喜欢(在许多情况下)“重新发明轮子”,可以说是为了能够管理我自己的工作。但当然,从成本或其他方面来看,这并不总是有效的。

      祝你好运!

      【讨论】:

        【解决方案4】:

        看起来你想用谷歌搜索的是 C++ 客户端/服务器。我可以在这里建议两种方法。

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

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

        请注意,我没有测试我链接到的任何代码。我只是在谷歌上找到的。

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-11-28
            • 1970-01-01
            • 2012-03-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-02-17
            相关资源
            最近更新 更多