Socket.io-client- cpp приложение UWP - PullRequest
0 голосов
/ 07 мая 2020

В настоящее время я пытаюсь взять пример консоли из: https://github.com/socketio/socket.io-client-cpp/blob/master/examples/Console/main.cpp

и переписать его для приложения C ++ UWP, однако всякий раз, когда я добираюсь до конца main в этом блоке кода:

MainPage::MainPage()
{

    InitializeComponent();

        sio::client h;
        connection_listener l(h);
        h.set_open_listener(std::bind(&connection_listener::on_connected, &l));
        h.set_close_listener(std::bind(&connection_listener::on_close, &l, std::placeholders::_1));
        h.set_fail_listener(std::bind(&connection_listener::on_fail, &l));
        h.connect("https://localhost:8080"); //changed
        _lock.lock();
        if (!connect_finish)
        {
            _cond.wait(_lock);
        }
        _lock.unlock();
        current_socket = h.socket();
    Login:
        string nickname;
        submit->Click += ref new Windows::UI::Xaml::RoutedEventHandler(this, &SocketIOUWP::MainPage::submit_Click);
        //while (nickname.length() == 0) {
        //    

        //    getline(cin, nickname);
        //}
        nickname = "olly";
        current_socket->on("login", sio::socket::event_listener_aux([&](string const& name, message::ptr const& data, bool isAck, message::list& ack_resp) {
            _lock.lock();
            participants = data->get_map()["numUsers"]->get_int();
            bool plural = participants != 1;
            //HIGHLIGHT("Welcome to Socket.IO Chat-\nthere" << (plural ? " are " : "'s ") << participants << (plural ? " participants" : " participant"));
            _cond.notify_all();
            _lock.unlock();
            current_socket->off("login");
            }));
        current_socket->emit("add user", nickname);
        //current_socket->emit("new message", std::string("hello"));
        _lock.lock();
        if (participants < 0) {
            _cond.wait(_lock);
        }
        _lock.unlock();
        //bind_events();

        //HIGHLIGHT("Start to chat,commands:\n'$exit' : exit chat\n'$nsp <namespace>' : change namespace");
        for (std::string line; std::getline(std::cin, line);) {
            if (line.length() > 0)
            {
                if (line == "$exit")
                {
                    break;
                }
                else if (line.length() > 5 && line.substr(0, 5) == "$nsp ")
                {
                    string new_nsp = line.substr(5);
                    if (new_nsp == current_socket->get_namespace())
                    {
                        continue;
                    }
                    current_socket->off_all();
                    current_socket->off_error();
                    //per socket.io, default nsp should never been closed.
                    if (current_socket->get_namespace() != "/")
                    {
                        current_socket->close();
                    }
                    current_socket = h.socket(new_nsp);
                    bind_events();
                    //if change to default nsp, we do not need to login again (since it is not closed).
                    if (current_socket->get_namespace() == "/")
                    {
                        continue;
                    }
                    goto Login;
                }
                current_socket->emit("new message", line);
                _lock.lock();
                //EM("\t\t\t" << line << ":" << "You");
                _lock.unlock();
            }
        }
        //HIGHLIGHT("Closing...");
        //h.sync_close();
    //h.clear_con_listeners();
}

Он вызывает класс connection_listener и событие on_close, затем разрывает соединение сокета и больше не функционирует.

class connection_listener
{
  sio::client& handler;

public:

  connection_listener(sio::client& h) :
      handler(h)
  {
  }


  void on_connected()
  {
      _lock.lock();
      _cond.notify_all();
      connect_finish = true;
      _lock.unlock();
  }
  void on_close(client::close_reason const& reason)
  {
      std::cout << "sio closed " << std::endl;
      connect_finish = false; 
      participants = -1;
      //exit(0);
  }

  void on_fail()
  {
      std::cout << "sio failed " << std::endl;
      //exit(0);
  }
};

Я пробовал бесконечное l oop в main, но, очевидно, это создает не отвечающий пользовательский интерфейс. Первоначально это было консольное приложение, я думаю, это означает, что деструктор не был вызван, потому что он оставался в пределах области действия for l oop. Мне просто нужен совет по реализации этого чата, который останется на связи.

Спасибо.

...