2016-04-07 70 views
0

使用libstrophe,我可以在連接鬆動時自動重新連接。 我用下面的代碼在客戶端:XMPP使用libstrophe自動重新連接

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: connected\n");  
    } 
    else { 
     fprintf(stderr, "DEBUG: disconnected\n"); 
    } 
} 
void main() 
{ 
    xmpp_log_t *log; 
    char  *jid;  
    jid = strdup("[email protected]") 
    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:連接」 當服務器發生以後,我得到的消息「DEBUG :斷開連接「。但是當服務器第二次啓動時,客戶端不會自動重新連接。

回答

0

Libstrophe不會自動重新連接。從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: connected\n"); 
    } 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 = "[email protected]"; 
    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: connected\n"); 
    } 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 = "[email protected]"; 
    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; 
}