передача данных из c ++ (приложения opencv) в переполнение стека

в настоящее время я пишу приложение opencv C ++. Я хочу, чтобы эта программа на С ++ все время работала в состоянии ожидания, и как только пользователь нажмет кнопку на коде php (Jquery), и программа будет активирована. Я решил использовать сокет для активации программы, и я не знаю, как передать значение обратно в php после завершения этой программы. Любой предложит любое решение. У меня довольно много поисков в интернете, но большинству из них приходится перезапускать программу каждый раз, чтобы получить данные, например Передача данных из C ++ в PHP. Спасибо

0

Решение

Я не знаю, как передать значение обратно в 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,

Это должно дать вам достаточно информации, чтобы поиграть и провести дальнейшие исследования.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]