c - xmpp 的 libstrophe 库的使用

标签 c xmpp libstrophe

我正在尝试使用 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 是您的地址(例如“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。

关于c - xmpp 的 libstrophe 库的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20745650/

相关文章:

c++ - GCC 插件,添加新的优化编译指示

c - C 中 64 位整数的模乘法

c - 当我释放字符串数组时,我的程序崩溃了

C - 访问链表内部的链表

iphone - 包含 Kal.a(来自 Kal 日历)和包含 libidn.a(xmpp 框架)会导致应用程序崩溃

java - 使用 Pidgin 测试 XMPP Camel 路由

c - 如何使用 libstropice 获取 Jabber 中用户的头像

android - 如何在 Android 上使用 Smack

c - 如何合并来自不同项目的事件循环

c++ - 如何在 C++ 中制作唯一的 lambda 实例?或者,如何使用 libstrophe 在 xmpp 中设置 id 消息处理程序?