gpt4 book ai didi

c++ - 使用 C++ casablanca 设置多个监听器

转载 作者:行者123 更新时间:2023-11-28 06:22:44 25 4
gpt4 key购买 nike

我需要设置一个应用程序来监听多个 Urls,但不知道何时开始多少 - 这最终将从数据库中读取,但目前它们在演示中进行了硬编码。

// MultipleListenerTest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <string>
#include <vector>

#include <cpprest\http_listener.h>
#include <cpprest\http_client.h>

#include "TestListener.h" // listener object

using namespace web::http::client;
using namespace web::http::experimental::listener;
using namespace web::http;
using namespace web;

void SetListenerArray();

typedef std::vector<http_listener> httpListeners;

listenerCollection listeners;

TestListener listener1;
TestListener Listener2;
TestListener Listener3;

httpListeners httpListenersList;
void handle_get(http_request request);
void handle_post(http_request request);
void handle_put(http_request request);
void handle_del(http_request request);


int _tmain(int argc, _TCHAR* argv[])
{

SetListenerArray();

for each (TestListener tl in listeners)
{
http_listener l(tl.GetUrl());

l.support(methods::GET, handle_get);
l.support(methods::POST, handle_post);
l.support(methods::PUT, handle_put);
l.support(methods::DEL, handle_del);

l.open().wait();
httpListenersList.push_back(l);
}

std::string line;
std::cout << "Press enter to exit" << std::endl;
std::getline(std::cin, line);

//listenerVoices_1.close().wait();
//listenerVoices_2.close().wait();

return 0;
}

void SetListenerArray()
{

// first listener
listener1.SetListenerName(to_string_t("FirstListener"));
listener1.SetUrl(to_string_t("http://localhost:8010"));
listeners.push_back(listener1);

// second listener
Listener2.SetListenerName(to_string_t("Second Listener"));
Listener2.SetUrl(to_string_t("http://localhost:8020"));
listeners.push_back(Listener2);

//third listener
Listener3.SetListenerName(to_string_t("Third Listener"));
Listener3.SetUrl(to_string_t("http://localhost:8030"));
listeners.push_back(Listener3);

}

void handle_get(http_request request)
{
for each (TestListener tl in listeners)
{
std::cout << to_utf8string(tl.GetListenerName());
}
}

void handle_post(http_request request)
{

}

void handle_put(http_request request)
{

}

void handle_del(http_request request)
{

}

加上上面的代码行

httpListenersList.push_back(l);

编译失败

错误 1 ​​错误 C2248:“web::http::experimental::listener::http_listener::http_listener”:无法访问在类“web::http::experimental::listener::http_listener”中声明的私有(private)成员 c :\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0 593 1 MultipleListenerTest

如果我将其排除在外,那么实际上没有任何听众在听,您会得到 This webpage is not available in Chrome at least.

如果事先不知道需要多少监听器,那么如何设置多个监听器呢?

最佳答案

使用线程——每个线程执行一个监听器。

下面是类中执行监听器的方法。

void Listener::Start()
{
Logger logger;
std::string logMessage("Starting '" + to_utf8string(GetName()) + "' Listener");
http_listener httpListener(GetUri());
std::string listenerName(to_utf8string(name));

logger.log(logMessage);

// listener recieves a GET request.
httpListener.support(methods::GET, [listenerName](http_request request)
{
Logger logger;

std::string logMessage("GET request recieved from " + listenerName);

logger.log(logMessage);

// dummy line just till routing is dealt with
request.reply(status_codes::OK, logMessage);

});

// open listener and route request
httpListener
.open()
.then([&httpListener,listenerName](){
Logger logger;
std::string logMessage(listenerName + " started");

logger.log(logMessage);

}).wait();

// JUST WAIT - we do not want the application to stop
while (true);

}

然后在程序中执行以下代码,将所有监听器收集到一个 vector 中。

然后扫描 vector 以创建每个线程。

RouteMaps rm;
Logger logger;
Listeners ls;
std::vector<std::thread> listener_threads;
std::vector<Listener> lvector;

std::cout.sync_with_stdio(true);

// collect all the listeners into a vector

for (auto& m : rm.Select()) {
for (auto& l : ls.Select(m.GetId())) {
std::string logMessage("Retrieved Listener " + to_utf8string(l.GetName()));
logger.log(logMessage);
lvector.push_back(l);
}
}

std::cout << "Starting listeners" << std::endl;
// now create threads for each listener
for (auto& lstnr : lvector)
{
listener_threads.push_back(std::thread{ &Listener::Start, &lstnr });
}

然而,应用程序将退出并结束 - 停止每个线程。现在在每个线程的底部都有一个永久循环 - 这意味着没有线程会真正结束。

要停止程序执行,杀死每个线程,需要使用以下循环将它们连接到主线程。

for (auto& t : listener_threads)
{
t.join();
}

通过这种方式,我们现在有了多个线程,您不必在代码中定义多少。

现在,当我将每个监听器的域放入浏览器时,我们都会收到每个监听器的回复。

关于c++ - 使用 C++ casablanca 设置多个监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29062247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com