В настоящее время я пытаюсь взять пример консоли из: 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. Мне просто нужен совет по реализации этого чата, который останется на связи.
Спасибо.