c-XMPP使用libstrophe自动重新连接



使用libstrohe,当我断开连接时,我可以自动重新连接吗。我在客户端使用了以下代码:

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)
{
    if (status == XMPP_CONN_CONNECT) {
        fprintf(stderr, "DEBUG: connectedn");      
    }
    else {
        fprintf(stderr, "DEBUG: disconnectedn");
    }
}
void main()
{
    xmpp_log_t  *log;
    char        *jid;       
    jid = strdup("test@domain.com")
    xmpp_initialize();
    log = xmpp_get_default_logger(XMPP_LEVEL_ERROR);    
    cwmp->xmpp_ctx = xmpp_ctx_new(NULL, log);
    cwmp->xmpp_conn = xmpp_conn_new(cwmp->xmpp_ctx);
    xmpp_conn_set_jid(cwmp->xmpp_conn, jid);
    xmpp_conn_set_pass(cwmp->xmpp_conn, cwmp->xmpp_param.password);
    xmpp_connect_client(cwmp->xmpp_conn, NULL, 0, conn_handler, cwmp->xmpp_ctx);
xmpp_run(cwmp->xmpp_ctx);
}   

当客户端第一次连接时,我收到消息"DEBUG:connected"当服务器完成后,我会收到消息"DEBUG:disconnected"。但是当服务器第二次启动时,客户端不会自动重新连接。

Libstrohe不会自动重新连接。从libstrophe-0.9.0开始,xmpp_conn_t对象可以在不丢失登录信息和用户处理程序的情况下重新连接:

#include <stdio.h>
#include <strophe.h>
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)
{
    if (status == XMPP_CONN_CONNECT) {
        fprintf(stderr, "DEBUG: connectedn");
    } else {
        fprintf(stderr, "DEBUG: disconnected, reconnecting...n");
        xmpp_connect_client(conn, NULL, 0, conn_handler, userdata);
    }
}
int main()
{
    xmpp_log_t  *log;
    xmpp_ctx_t  *ctx;
    xmpp_conn_t *conn;
    const char  *jid  = "test@domain.com";
    const char  *pass = "password";
    xmpp_initialize();
    log = xmpp_get_default_logger(XMPP_LEVEL_ERROR);
    ctx = xmpp_ctx_new(NULL, log);
    conn = xmpp_conn_new(ctx);
    xmpp_conn_set_jid(conn, jid);
    xmpp_conn_set_pass(conn, pass);
    xmpp_connect_client(conn, NULL, 0, conn_handler, NULL);
    xmpp_run(ctx);
    xmpp_conn_release(conn);
    xmpp_ctx_free(ctx);
    xmpp_shutdown();
    return 0;
}

在0.9.0之前的版本中,用户在断开连接后不能重用xmpp_conn_t对象,需要创建新对象。libstrophe-0.8.8及更早版本的示例:

#include <stdio.h>
#include <strophe.h>
#define TIMEOUT 1000
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)
{
    int *reconnect = userdata;
    if (status == XMPP_CONN_CONNECT) {
        fprintf(stderr, "DEBUG: connectedn");
    } else {
        fprintf(stderr, "DEBUG: disconnected, reconnecting...n");
        *reconnect = 1;
    }
}
int main()
{
    xmpp_log_t  *log;
    xmpp_ctx_t  *ctx;
    xmpp_conn_t *conn;
    const char  *jid  = "test@domain.com";
    const char  *pass = "password";
    int          reconnect;
    xmpp_initialize();
    log = xmpp_get_default_logger(XMPP_LEVEL_ERROR);
    ctx = xmpp_ctx_new(NULL, log);
    while (1) {
        conn = xmpp_conn_new(ctx);
        xmpp_conn_set_jid(conn, jid);
        xmpp_conn_set_pass(conn, pass);
        xmpp_connect_client(conn, NULL, 0, conn_handler, &reconnect);
        reconnect = 0;
        while (!reconnect)
            xmpp_run_once(ctx, TIMEOUT);
        xmpp_conn_release(conn);
    }
    xmpp_ctx_free(ctx);
    xmpp_shutdown();
    return 0;
}

相关内容

  • 没有找到相关文章

最新更新