1

我正在使用 libstrophe 在 C 中开发一个简单的 ejabberd 客户端。它连接并开始按应有的方式处理消息。

但是,过了一会儿(在来自 ejabberd 服务器的两到三个 ping 之后),我的连接关闭并且状态设置为DISCONNECTED. 下面是调试行的尾部:

xmpp DEBUG Unrecoverable TLS error, 5. 
xmpp DEBUG Closing socket.
DEBUG: disconnected event DEBUG Stopping event loop. 
event DEBUG Event
oop completed.

我初始化并连接如下。

xmpp_initialize();

/* read connection params */
if( set_xmpp_conn_params( &conn_params ) < 0 ) {
    fprintf(stderr, "Could not retrieve connection params from %s\n", 
                    SERVER_CONF_FILE);
    return -1;
}

/* initialize the XMPP logger */
xmpp_log = xmpp_get_default_logger(XMPP_LOG_LEVEL);
xmpp_ctx = xmpp_ctx_new(NULL, xmpp_log);

/* create a connection */
xmpp_conn = xmpp_conn_new(xmpp_ctx);

/* login */
xmpp_conn_set_jid(xmpp_conn, conn_params.jid);
xmpp_conn_set_pass(xmpp_conn, conn_params.password);

/* create a client */
xmpp_connect_client(    xmpp_conn, conn_params.host, 0, 
                        agent_conn_handler, xmpp_ctx );

/* enter the event loop */
xmpp_run( xmpp_ctx );

/*  the code below is executed 
    whenever connection handler @agent_conn_handler exits */

/* release the connection and context */
xmpp_conn_release(xmpp_conn);
xmpp_ctx_free(xmpp_ctx);

为什么我会收到 TLS 错误消息?

谢谢。

4

1 回答 1

0

错误 5 是 SSL_ERROR_SYSCALL。OpenSSL文档说:

发生了一些 I/O 错误。OpenSSL 错误队列可能包含有关错误的更多信息。如果错误队列为空(即 ERR_get_error() 返回 0),则可以使用 ret 来查找有关错误的更多信息:如果 ret == 0,则观察到违反协议的 EOF。如果 ret == -1,则底层 BIO 报告 I/O 错误(对于 Unix 系统上的套接字 I/O,请参阅 errno 了解详细信息)。

实际上,这可能意味着服务器出于某种原因断开了您的连接。我建议使用WireShark进行数据包跟踪以获取更多信息。例如,当客户端提供 TLS 版本 1.1 时,我们已经看到使用 TLS 的 RSA 库的服务器会发生这种情况。

于 2014-02-21T03:31:13.403 回答