我试图用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在必要时自动进行身份验证。这发生在xmpp_run()中。使用以下行设置它使用的凭据:

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

jid是您的地址(例如“[email protected]”、“[email protected]”、“[email protected]”等),而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()的任何内容。如果要保留每个连接的某些状态,并且不希望使用全局变量或具有多个连接,则此选项非常有用。
最后,您不必在"talk.google.com"中指定xmpp_connect_client(),我建议改为传递NULL。

10-05 23:56