1

我正在尝试使用 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(..) 但它没有正确执行身份验证。即它不会通知我错误的用户名或密码。任何人都可以建议我验证我的实体的正确方法。

4

1 回答 1

0

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 第 4.9.3 节中。

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

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

于 2013-12-24T12:58:19.257 回答