2014-10-11 110 views
0

目前我正在编写一个opencv C++应用程序。我希望这个C++程序一直处于等待状态,一旦用户点击了php代码(jquery)上的按钮,程序就会被激活。我决定使用套接字来激活程序,并且我不知道如何在程序运行完成后将值传回给php。任何人都会建议任何解我在互联网上搜索了很多,但其中大多数都必须每次重新启动程序才能获取数据,如Passing data from C++ to PHP。由于将数据从C++(opencv应用程序)传递到php

+0

最好的解决方案取决于两个程序是否运行在同一台机器上。 – 2014-10-11 09:13:40

+0

但是无论如何,如果你使用套接字,那么问题是什么?你已经建立了完全灵活的沟通形式,不是吗? – 2014-10-11 09:14:53

+0

我是新的套接字通信..是一种使用套接字传回价值的PHP .. ..?两者都在同一台机器上运行。 @ChristianHackl – JHJL 2014-10-11 09:16:53

回答

1

我不知道怎么传值回这个节目 完成运行

后到PHP我觉得是关键字在这里。我怀疑你的困惑的事实,你莫名其妙地要在C++程序的返回值传递给你的PHP程序,即像梗:

int main() 
{ 
    // ... 
    return value; // to PHP 
} 

这是错误的做法。您的C++程序在运行时必须使用套接字将数据传递给PHP。

我建议您尝试Boost.Asio来开发C++套接字部分。看看这些例子,特别是最简单的例子之一,blocking_tcp_echo_server.cpp。请转至http://www.boost.org/users/download/以了解如何在您的机器上安装Boost。

下面是基于该升压例的非常短的C++程序:

#include <iostream> 
#include <string> 
#include <sstream> 
#include <boost/bind.hpp> 
#include <boost/smart_ptr.hpp> 
#include <boost/asio.hpp> 
#include <boost/thread/thread.hpp> 

using boost::asio::ip::tcp; 

typedef boost::shared_ptr<tcp::socket> socket_ptr; 

void session(socket_ptr sock) 
{ 
    std::cout << "session...\n"; 
    try 
    { 
     boost::system::error_code error; 
     boost::asio::streambuf buffer; 
     boost::asio::read_until(*sock, buffer, "\n", error); 
     if (error) 
     { 
      throw boost::system::system_error(error); 
     } 
     std::istream str(&buffer); 
     std::string from_php; 
     std::getline(str, from_php); 

     std::cout << from_php << "\n"; 
     std::string const from_cpp = "from C++"; 
     boost::asio::write(*sock, boost::asio::buffer(from_cpp)); 
     std::cout << "finished\n"; 
    } 
    catch (std::exception const &e) 
    { 
     std::cerr << "Exception in thread: " << e.what() << "\n"; 
    } 
} 

void server(boost::asio::io_service &io_service) 
{ 
    tcp::acceptor a(io_service, tcp::endpoint(tcp::v4(), 1234)); 
    for (;;) 
    { 
     socket_ptr sock(new tcp::socket(io_service)); 
     a.accept(*sock); 
     boost::thread t(boost::bind(session, sock)); 
    } 
} 

int main() 
{ 
    try 
    { 
     boost::asio::io_service io_service; 
     server(io_service); 
    } 
    catch (std::exception const &e) 
    { 
     std::cerr << "Exception: " << e.what() << "\n"; 
    } 
} 

它接收在端口1234的字符串,并在一个被称为from_phpstd::string保存它。来自PHP的字符串必须以'\n'结尾。然后它将字符串"from C++"发回,最终关闭套接字。

现在看看PHP documentation's socket examples(查找“Example#2 Socket example:Simple TCP/IP client”)。再次,这里是一个简化的版本:

<?php 
error_reporting(E_ALL); 

$service_port = 1234; 
$address = gethostbyname('localhost'); 

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

$result = socket_connect($socket, $address, $service_port); 
if ($result === false) { 
    die("socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n"); 
} 

$in = "from PHP\n"; 
socket_write($socket, $in, strlen($in)); 

$from_cpp = ""; 
while ($data = socket_read($socket, 2048)) { 
    $from_cpp .= $data; 
} 

echo $from_cpp; 

socket_close($socket); 
?> 

它发送字符串"from PHP\n"到端口1234上的本地主机和接收字符串返回从它,它存储在变量from_cpp

这应该给你足够的信息来玩并做进一步的研究。

+0

感谢您的帮助......我会尝试 – JHJL 2014-10-11 10:45:16

+0

@JHJL:不,为什么呢?把它变成一个字符串,并确保C++和PHP部分使用相同的约定。例如,如果你的计算值只是一个简单的'int',把它变成一个带有'boost :: lexical_cast'的字符串(如果你使用C++ 11的话就是'std :: to_string')。 – 2014-10-11 10:54:57

+0

std :: string const from_cpp = std :: to_string(数字);这样对吗? – JHJL 2014-10-11 10:57:57

相关问题