Легко создать веб-страницу с Wt на любом порту, например, 200.59.43.32:3333.
Однако есть ли функция (которую я не могу найти) для прослушивания того же порта, когда кто-то отправляет на него данные (некоторая строка данных, json и т. Д.). Другими словами, если кто-то отправит строку с данными «много данных» на 200.59.43.32:3333, как я могу перехватить ее с помощью Wt?
Изменить: Если это невозможно с простой строкой, это возможно с надлежащим JSON?
Я знаю, что могу открыть другой порт для прослушивания такой строки, используя (linux) socket / bind и т.д ..
Если вы хотите отправить простые строки, вам нужно открыть сокет. HTTP-приложения общаются с клиентами по протоколу HTTP, поэтому для этого «Wt-way» необходимо выполнить HTTP-запрос, GET или POST.
Из того, что я понимаю, вам нужно создать WResource
и зарегистрируйте его на сервере, используя WServer::addResource()
дать ему фиксированный URL. После этого переопределения WResource::handleRequest()
для доступа к данным HTTP-запроса.
Если это просто случайные данные, я не знаю, что вы можете сделать это с помощью Wt. В этом случае вы можете использовать решение обратного прокси-сервера, такое как HAProxy, и перенаправлять любой HTTP-трафик на Wt, а любой другой трафик на другой сокет.
Если вы говорите о HTTP-трафике, статические ресурсы могут быть тем, что вам нужно. Реализация Wt Тесты инфраструктуры TechEmpower содержит некоторые пользовательские статические ресурсы, на которых вы можете основывать свой код. Например, есть PlaintextResource
:
class PlaintextResource : public Wt::WResource {
virtual void handleRequest(const Wt::Http::Request &request, Wt::Http::Response &response) {
response.setMimeType("text/plain");
response.addHeader("Server", "Wt");
response.out() << "Hello, World!";
}
};
Вы можете использовать request
переменная для получения любых данных о запросе, см. Wt :: Http :: Запрос.
Вы можете сделать этот ресурс доступным вот так:
int main(int argc, char** argv) {
try {
Wt::WServer server(argv[0]);
server.setServerConfiguration(argc, argv, WTHTTP_CONFIGURATION);
PlaintextResource plaintextResource;
server.addResource(&plaintextResource, "/plaintext");
if (server.start()) {
int sig = Wt::WServer::waitForShutdown(argv[0]);
std::cerr << "Shutdown (signal = " << sig << ")" << std::endl;
server.stop();
}
} catch (Wt::WServer::Exception& e) {
std::cerr << e.what() << "\n";
return 1;
} catch (std::exception& e) {
std::cerr << "exception: " << e.what() << "\n";
return 1;
}
}