我正在使用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 %sn",
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 错误消息?
谢谢。
错误 5 SSL_ERROR_SYSCALL。 OpenSSL文档说:
发生一些 I/O 错误。OpenSSL 错误队列可能包含更多 有关错误的信息。如果错误队列为空(即 ERR_get_error() 返回 0),ret 可用于了解有关 错误:如果 ret == 0,则观察到违反协议的 EOF。如果 ret == -1,底层 BIO 报告 I/O 错误(对于套接字 I/O Unix 系统,有关详细信息,请查阅 errno)。
实际上,这可能意味着服务器由于某种原因断开了您的连接。 我建议使用WireShark进行数据包跟踪以获取更多信息。 例如,当客户端提供 TLS 版本 1.1 时,我们已经看到使用 RSA 库进行 TLS 的服务器会发生这种情况。