繁体   English   中英

同一台机器上的套接字连接,PHP到C ++并返回

[英]Socket connection on same machine, PHP to C++ and back

我必须在用c ++编写的应用程序和用PHP编写脚本的Web服务器之间实现通信。 基本思想是使用c ++应用程序创建一个套接字,绑定它并监听与它的PHP连接。 然后,PHP将通过TCP发送消息,要求提供数据,然后c ++将发回答案。 单头请求,单字符串(JSON)答案。 到现在为止还挺好。 这是我用于PHP方面的代码:

<?php
error_reporting(E_ALL);

$service_port = 8080;
$address = 'localhost';


$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
} 

echo "Attempting to connect to '$address' on port '$service_port'...";
$result = socket_connect($socket, $address, $service_port);
if ($result === false) {
    echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
} 


$in = "request1";

$out = '';

socket_write($socket, $in, strlen($in));

$buf = 'This is my buffer.';
if (false !== ($bytes = socket_recv($socket, $buf, 2048, MSG_WAITALL))) {
    echo "Read $bytes bytes from socket_recv(). Closing socket...";
} else {
    echo "socket_recv() failed; reason: " . socket_strerror(socket_last_error($socket)) . "\n";
}
socket_close($socket);

echo $buf . "\n";
//elaborate the $buf
?>

现在我想实现数据的自动更新,c ++(服务器端)发送数据,PHP端(客户端)收集它们。 数据更新应该每分钟完成一次。 可悲的是,我没有太多的网络开发经验,所以我很乐意就此提出一些建议。

我能做的最简单的事情是循环PHP代码,直到收到已知的消息。 我遇到的问题是,我没有得到数据,直到循环结束,PHP脚本结束。 为了解决这个问题,我尝试将套接字设置为非阻塞替换套接字,用MSG_DONTWAIT选项MSG_WAITALL替换,但没有改变。 然后我试图打破PHP脚本,但由于我需要循环它以每秒获取数据,所以无法完成。 另外我得到另一个问题,在循环周期中,运行PHP的apache服务器出现503错误,服务器不可用。 我不知道它为什么会发生,也许收到的消息缓冲区已满,或者脚本占用了太多资源。 由于我缺乏经验,我无法理解为什么。 我知道有很好的库可以执行我需要的东西,但我正在使用嵌入式机器,因此我只能使用基本库。

如何在Apache服务器上实现PHP以从c ++应用程序获取定时数据? 我在俯瞰什么? 非常感谢您的帮助。

编辑:删除修辞问题。

与使用tcp / ip套接字将数据从通过apache执行的php脚本发送到另一个进程相比,使用php通过tcp / ip从另一个进程获取数据需要更多的努力。

您的PHP脚本需要在apache之外启动,并且需要一个无限循环,持续监听给定端口以读取输入数据。 以下帖子概述了我相信你所追求的。

编辑

为了在网页上显示结果,您可以使用内存数据存储,例如Redis。 php服务器应用程序将以redis更新数据结构,然后网页onload可以从redis中提取最新值并将其显示在屏幕上,但这需要页面刷新。

如果您要求在没有服务器回发的情况下立即刷新数据,则需要一些javascript。 当用户加载页面时,您将使用websocket服务器初始化websocket连接(人们通常使用node.js和socket.io来实现此功能,但您可以在支持该技术的任何内容中编写websocket服务器代码)。 websocket服务器将订阅redis频道,该频道在更新时会将新值发送给所有连接的客户端。 我想这可以在没有redis的情况下完成,具体取决于您的要求。 websocket服务器的程序也可以是使用单独的线程接受来自c ++程序的信息的服务器。 当数据从c ++程序进入时,您可以将其直接发送到通过websocket连接的客户端。

不要重新发明轮子。 使用websockets。 它旨在执行此异步通信,您可以通过它发送JSON就好了。

有C ++和PHP库,这意味着这应该很容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM