使用libjingle登录XMPP



我正在使用libjingle编写一些代码,但在第一步登录XMPP服务器时遇到了问题。我的代码是基于goog的示例代码和pcp的示例代码。这段代码让我有点困惑,因为它似乎只运行一个线程,所以我意识到这是一个非常基本的问题。

不管怎样,这是我的代码:

    talk_base::PhysicalSocketServer ss;
    talk_base::AutoThread main_thread(&ss);
    buzz::Jid jid( xmppUsername + "@" + xmppHost );
    if (!jid.IsValid() || jid.node() == "")
        throw "Invalid JID. JIDs should be in the form user@domain" ;
    buzz::TlsOptions tls = buzz::TLS_ENABLED;
    buzz::XmppClientSettings xcs;
    xcs.set_user(jid.node());
    xcs.set_host(jid.domain());
    xcs.set_resource("pcp");
    xcs.set_pass(talk_base::CryptString(pass));
    xcs.set_allow_plain(true);
    xcs.set_server(talk_base::SocketAddress(xmppHost.c_str(), 5222));
    xcs.set_use_tls(tls);
    // Log in.
    CustomXmppPump pump;
    pump.client()->SignalLogInput.connect(&debug_log_, &DebugLog::Input);
    pump.client()->SignalLogOutput.connect(&debug_log_, &DebugLog::Output);
    pump.DoLogin(xcs, new XmppSocket(tls), 0);
    // Wait until login succeeds.
    std::vector<uint32> ids;
    ids.push_back(MSG_LOGIN_COMPLETE);
    ids.push_back(MSG_LOGIN_FAILED);
    if (MSG_LOGIN_FAILED == Loop(ids))
        throw "Failed to connect";
    ...
    // Runs the current thread until a message with the given ID is seen.
    uint32 Loop(const std::vector<uint32>& ids) {
      talk_base::Message msg;
      while (talk_base::Thread::Current()->Get(&msg)) {
        cout << "received message: " << msg.message_id << endl;
        if (msg.phandler == NULL) {
          if (std::find(ids.begin(), ids.end(), msg.message_id) != ids.end())
            return msg.message_id;
          std::cout << "orphaned message: " << msg.message_id << endl;
          continue;
        }
        cout << "1: " << msg.message_id <<  " : " << msg.ts_sensitive << endl;
        talk_base::Thread::Current()->Dispatch(&msg);
        cout << "2: " << msg.message_id << endl;
      }
      return 0;
    }

运行时输出:

正在连接。。。收到的消息:01:0:0[004:722]正在解析PhysicalSocket::Connect中的地址2:0收到的消息:01:0:02:0

只是挂起了,很明显它被卡住了。

我应该注意,我的服务器使用DNS SRV记录,并且与其他客户端配合良好——也许我只需要自己解决SRV?

谢谢你的帮助!

T回答我自己的问题:

根据这个错误,以及我自己的测试,dns SRV不受支持。

此外,根据这个bug,文档非常过时,我使用的示例代码不是推荐的示例代码。

尽管如此,我还是能够通过在这个调用中设置域来登录取得一些进展:

xcs.set_server(talk_base::SocketAddress(xmppHost.c_str(), 5222));

到托管该服务的实际服务器的值。我以为我已经尝试过了,但没有成功,因为我实际上已经改变了这个:

xcs.set_host(jid.domain());

哎呀。

相关内容

  • 没有找到相关文章

最新更新