我有一段非常基本的代码,用于登录 libjingle 中的 xmpp 服务器。
我无法登录服务器。我确信参数是正确的,因为我检查了 xmpp 客户端程序。
我的顺序是这样的:
- 创建
XmppPump
. - 的设置回调
xmppPump.client().SignalStateChange
,当通过XmppEngine
. - 启动信号线程并阻塞在
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.";