c ++ rest sdk http_listener в качестве сетевого сервера

Как настроить http_listener для прослушивания моего IP-адреса, чтобы другие компьютеры
в сети можно отправлять запросы на сервер?

http_listener listener(L"http://localhsot:9000"); // not working
http_listener listener(L"http://0.0.0.0:9000"); // run time error
http_listener listener(L"http://*:9000");       // run time error

Я хочу использовать c ++ rest sdk в качестве сервера в моей локальной сети.

2

Решение

Причина по которой http_listener listener(L"http://localhsot:9000");

не работает, потому что «localhost» написано неправильно.

После того, как вы исправите опечатку, вы сможете настроить свой веб-браузер на
HTTP: // локальный: 9000 и вы получите запрос. Проверьте это с помощью функции печати.

Как уже упоминалось, не забудьте настроить поддержку запроса.

Listener.support(methods::GET, std::bind(&HandleGet, this, std::placeholders::_1));

и функция HandleGet (если запрос GET)

HandleGet(http_request request)
{
std::wcout << L"Received GET request" << std::endl;
}

Так что после того, как это было настроено, направьте ваш веб-браузер на адрес, и вы должны увидеть результат.

Кроме того, вы можете обернуть ServerInit.open().wait() (начинает слушать) в try/catch чтобы понять, почему это не работает.

3

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

Будучи автором, я очень рекомендую Restbed. Это проект с открытым исходным кодом, написанный на C ++ 11 с целью достижения соответствия HTTP (s) 1.0-2.0.

#include <memory>
#include <cstdlib>
#include <restbed>

using namespace std;
using namespace restbed;

void get_method_handler( const shared_ptr< Session >& session )
{
const auto request = session->get_request( );

size_t content_length = 0;
request->get_header( "Content-Length", content_length );

session->fetch( content_length, [ ]( const shared_ptr< Session >& session,
const Bytes& body )
{
fprintf( stdout, "%.*s\n", ( int ) body.size( ), body.data( ) );

session->close( OK, "Hello, World!", { { "Content-Length", "13" } } );
} );
}

int main( const int, const char** )
{
auto resource = make_shared< Resource >( );
resource->set_path( "/resource" );
resource->set_method_handler( "GET", get_method_handler );

auto settings = make_shared< Settings >( );
settings->set_port( 1984 );
settings->set_default_header( "Connection", "close" );

Service service;
service.publish( resource );
service.start( settings );

return EXIT_SUCCESS;
}

Увидеть Вот для большего количества примеров.

2

https://casablanca.codeplex.com/discussions/478976

Генрих Ответ

Привет я тоже столкнулся с этой проблемой.
Вы можете решить эту проблему, используя nginx в качестве прокси в Linux. Это также может добавить функцию https на ваш сервер.
Вот небольшая версия необходимого файла конфигурации nginx:

   server {
listen *:80;
server_name localhost;

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://localhost:12345/;
proxy_redirect http://localhost:12345/ https://$server_name/;
}

Этот скрипт перенаправляет весь трафик на 12345. Теперь вам просто нужно слушать

   http_listener listener(L"http://localhost:12345");

Не забывайте звонить в «службу поддержки».
Ура,
Генри

0

Я создал учетную запись на dyndns.it и установил динамическую учетную запись dns моего маршрутизатора с именем пользователя и паролем учетной записи dynds.it.
После этого сервер прослушивает этот URL:

uri_builder uri(L"http://my_account.homepc.it:80/");
auto addr = uri.to_string();
http_listener listener(addr);listener.support(methods::POST, handle_post);

try
{
listener
.open()
.then([&listener](){TRACE(L"\nstarting to listen\n"); })
.wait();

while (true);
}
catch (exception const & e)
{
wcout << e.what() << endl;
}
catch (...)
{
wcout << "error" << endl;
}

и это работает из любого места (даже если я все еще не понимаю, как управлять POST от нескольких клиентов одновременно!)

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