【问题标题】:usage of libstrophe library for xmppxmpp 的 libstrophe 库的使用
【发布时间】:2013-12-23 14:36:21
【问题描述】:

我正在尝试使用 Libstrophe 在 C 中创建一个聊天客户端。我参考了https://github.com/metajack/libstrophe/blob/master/examples/active.c 给出的以下代码示例 该代码调用了 xmpp_connect_client(...) 以建立与 xmpp 服务器的连接。

 int main(int argc, char **argv)
 {
xmpp_ctx_t *ctx;
xmpp_conn_t *conn;

if (argc != 3) {
    fprintf(stderr, "Usage: active <jid> <pass>\n\n");
    return 1;
}

/* initialize lib */
xmpp_initialize();

/* create a context */
ctx = xmpp_ctx_new(NULL, NULL);

/* create a connection */
conn = xmpp_conn_new(ctx);

/* setup authentication information */
xmpp_conn_set_jid(conn, argv[1]);
xmpp_conn_set_pass(conn, argv[2]);

/* initiate connection */
xmpp_connect_client(conn, "talk.google.com", 0, conn_handler, ctx);

/* start the event loop */
xmpp_run(ctx);

/* release our connection and context */
xmpp_conn_release(conn);
xmpp_ctx_free(ctx);

/* shutdown lib */
xmpp_shutdown();

return 0;

} 但是身份验证在哪里进行?我查找了 libstrophe 的源代码并找到了 C 文件 auth.c https://github.com/metajack/libstrophe/blob/master/src/auth.c 它有一个名为 _auth(..) 的函数。 我尝试在我的代码中使用 _auth(..) 但它没有正确执行身份验证。即它不会通知我错误的用户名或密码。 任何人都可以建议我验证我的实体的正确方法吗?

【问题讨论】:

  • 哦,还请注意,您正在链接到 libstrophe 的较旧存储库(尽管目前没有太多差异)。现在在github.com/strophe/libstrophe

标签: c xmpp libstrophe


【解决方案1】:

libstrophe 会在必要时自动进行身份验证。这发生在 xmpp_run() 内部。它使用的凭据是使用这些行设置的:

/* setup authentication information */
xmpp_conn_set_jid(conn, argv[1]);
xmpp_conn_set_pass(conn, argv[2]);

jid 是您的地址(例如“user@jabber.org”、“user@gmail.com”、“user@dukgo.com”等),pass 是您的密码。

您的示例缺少您的 conn_handler 函数,该函数将传递身份验证错误。

你的 conn_handler 函数应该有这样的签名:

void conn_handler(xmpp_conn_t * const conn, const xmpp_conn_event_t status, 
                  const int error, xmpp_stream_error_t * const stream_error,
                  void * const userdata)

参数为:

conn - 你的连接对象。

status - XMPP_CONN_CONNECTXMPP_CONN_DISCONNECTXMPP_CONN_FAIL 之一。当你的连接处理函数被调用时,这个参数告诉你它被调用的原因。

error - 断开连接时 (XMPP_CONN_FAIL),它包含来自操作系统的套接字级错误代码(否则为 0)。

stream_error - 可能的流错误之一,列于strophe.h:171,其含义记录于RFC6120 section 4.9.3

userdata - 这包含您作为userdata 参数传递给xmpp_connect_client() 的任何内容。如果您有一些每个连接的状态要保留,并且您不想使用全局变量或有多个连接,这很有用。

最后,您不必在xmpp_connect_client() 中指定"talk.google.com",我建议改为传递NULL。

【讨论】:

  • 我添加了检查状态并进行必要更改的连接处理程序。与服务器的连接已建立。但是即使我指定了错误的密码,我也会得到相同的输出。命令提示符显示:
  • xmpp DEBUG sock_connect to alt3.xmpp.l.google.com:5222 返回 304 xmpp DEBUG 试图连接到 alt3.xmpp.l.google.com xmpp DEBUG 连接成功 conn DEBUG SENT: xml version="1.0"?>etherx.jabber.org/str eams">
  • xmpp DEBUG RECV: xmpp DEBUG RECV:X-OAUTH2X-GOOGLE-TOKEN TLSS DEBUG QuerySecurityPackageInfo() 成功 TLSS DEBUG AcquireCredentialsHandle( ) 成功
  • conn DEBUG SENT:,错误:0 xmpp DEBUG RECV: xmpp DEBUG 处理proceedtls 要求进行xmpp DEBUG 继续TLS TLSS DEBUG QuerySecurityPackageInfo() 成功TLSS DEBUG AcquireCredentialsHandle() 成功 xmpp DEBUG 无法启动TLS!错误 -2146893032 conn DEBUG SENT: xmpp DEBUG 解析错误,断开 xmpp DEBUG 关闭套接字。 DEBUG:断开事件 DEBUG 停止事件循环。 event DEBUG 事件循环完成。
  • “无法启动 TLS”消息可能是您的问题。确保使用 TLS 库(GnuTLS、OpenSSL 等)编译 libstrophe。当使用 status == XMPP_CONN_CONNECT 调用 conn_handler 时,您将知道身份验证已成功。附言我认为 cmets 不是此处用于调试日志的合适位置 - 请将它们添加到您的问题中(编辑它),或者如果您认为这是一个不同的问题,请创建一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-25
  • 2010-10-28
  • 1970-01-01
相关资源
最近更新 更多