2014-10-11 71 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

相關問題