1

我有一段非常基本的代码,用于登录 libjingle 中的 xmpp 服务器。

我无法登录服务器。我确信参数是正确的,因为我检查了 xmpp 客户端程序。

我的顺序是这样的:

  1. 创建XmppPump.
  2. 的设置回调xmppPump.client().SignalStateChange,当通过XmppEngine.
  3. 启动信号线程并阻塞在XmppPump::DoLogin完成后将被解除阻塞的未来。

buzz::XmppClient * xmppClient = mI->xmppPump.client();
assert(xmppClient != nullptr);

buzz::Jid jid = buzz::Jid(user);
std::string server = serverHost + ":" +
   std::to_string(kXmppClientDefaultPort);
bool allow_plain = true;

buzz::XmppClientSettings xcs;
xcs.set_user(jid.node());
xcs.set_resource(jid.resource());
xcs.set_host(jid.domain());
xcs.set_allow_plain(allow_plain);
xcs.set_use_tls(buzz::TLS_DISABLED);
talk_base::InsecureCryptStringImpl pass;
pass.password() = password;
xcs.set_pass(talk_base::CryptString(pass));
std::string server_;
int port;
std::size_t colon = server.find(':');
if (colon == std::string::npos) {
    server_ = server;
    port = kXmppClientDefaultPort;
}
else {
    server_ = server.substr(0, colon);
    port = atoi(server.substr(colon + 1).c_str());
}

std::cout << "Logging in as user " << jid.node() << std::endl;
std::cout << "User domain is " << jid.domain() << std::endl;
std::cout << "Resource is " << jid.resource() << std::endl;
std::cout << "Password is " << password << std::endl;
std::cout << "Logging into server " << server_;
std::cout << " port " << port << std::endl;

xcs.set_server(talk_base::SocketAddress(server_, port));
xcs.set_protocol(cricket::PROTO_SSLTCP);

talk_base::InitializeSSL();

std::future<buzz::XmppEngine::State> result =
   mI->xmppLoginState.get_future();

//Callback is setup here

xmppClient->SignalStateChange.connect(mI.get(),
                                           &Impl::OnStateChange);

std::cout << std::endl;
std::cout << "About to call buzz::XmppPump::DoLogin " << std::endl;

//Logging in async.
mI->xmppPump.DoLogin(xcs, new buzz::XmppSocket(buzz::TLS_DISABLED), nullptr);

std::cout << "Called buzz::XmppPump::DoLogin " << std::endl;

mI->signalingThread.Start();
std::cout << "Blocked waiting for buzz::xmppPump::DoLogin to finish."
          << std::endl;

//Forever here and XmppEngine::STATE_STARTED always.
result.get();
std::cout << "buzz::XmppPump::DoLogin finished.";
4

0 回答 0