Сервер не ждет подключения от клиента(С++/IXWebsocket)

#include <ixwebsocket/IXWebSocketServer.h>
#include <ixwebsocket/IXNetSystem.h>
#include <ixwebsocket/IXWebSocket.h>
#include <iostream>
#include <string>

using namespace std;

string GetToken() {
    ix::WebSocketServer GetTokenServer(9001);

    GetTokenServer.setOnConnectionCallback([](std::weak_ptr<ix::WebSocket> wsWeak,
    std::shared_ptr<ix::ConnectionState> state)
    {
        std::cout << "Client here..." << std::endl;
    });
    GetTokenServer.start();
    return "";
}

int main() {
    ix::initNetSystem();
    string token  = GetToken();
}

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


Ответы (1 шт):

Автор решения: Swift - Friday Pie

Сервер GetTokenServer "умрет" на выходе из функции GetToken(), т.к. это локальная переменная. Логичнее создавать сервер на боле высоком уровне и работать с ним.

Нужно получить сокет и поставить обработчик сообщений для того как определить когда же у нас завершилось подключение, а далее по вкусу. У них вроде есть полный рабочий пример, ws.cpp

#include <ixwebsocket/IXWebSocketServer.h>
#include <ixwebsocket/IXNetSystem.h>
#include <ixwebsocket/IXWebSocket.h>
#include <iostream>
#include <memory>
#include <atomic>

std::atomic<bool> doExit = false;

void startTokenServer(ix::WebSocketServer& srv ) 
{
    srv.setOnConnectionCallback([&](std::weak_ptr<ix::WebSocket> wsWeak,
    std::shared_ptr<ix::ConnectionState> state)
    {
        std::cout << "Client here..." << state->remoteIP << std::endl;
        auto ws = wsWeak.lock();
        if (ws) {
             ws->setOnMessageCallback(
                [&](const ix::WebSocketMessagePtr msg)
                {
                    if (msg->type == ix::WebSocketMessageType::Open)
                    {
                        std::cout << "New connection" << std::endl;
                        // установить состояние
                        doExit = true;
                    };
                });
        }
    });
    srv.start();

}

int main() {
    ix::initNetSystem();
    ix::WebSocketServer GetTokenServer(9001);
    
    startTokenServer(srv);
    // цикл ожидания
    while(!doExit) {
        
    }
    
    std::cin.get(); // подождем ввода пользователя?
    server.stop(); // Stop the server
}
→ Ссылка