в настоящее время я пишу приложение opencv C ++. Я хочу, чтобы эта программа на С ++ все время работала в состоянии ожидания, и как только пользователь нажмет кнопку на коде php (Jquery), и программа будет активирована. Я решил использовать сокет для активации программы, и я не знаю, как передать значение обратно в php после завершения этой программы. Любой предложит любое решение. У меня довольно много поисков в интернете, но большинству из них приходится перезапускать программу каждый раз, чтобы получить данные, например Передача данных из C ++ в PHP. Спасибо
Я не знаю, как передать значение обратно в 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 ++, основанная на примере Boost:
#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 и сохраняет ее в std::string
называется from_php
, Строка из PHP должна заканчиваться символом '\n'
, Затем отправляет строку "from C++"
назад, на котором сокет в итоге закрывается.
Теперь посмотрим на Примеры сокетов документации PHP (ищите «Пример # 2 Пример сокета: Простой клиент TCP / IP»). Опять же, вот упрощенная версия:
<?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 на localhost и получает от него строку, которую он хранит в переменной from_cpp
,
Это должно дать вам достаточно информации, чтобы поиграть и провести дальнейшие исследования.
Других решений пока нет …