1

在我的 c++ 应用程序中,我在我的网络功能中使用了 open ssl。我在成功连接到套接字后立即看到,在使用 SSL_read: SSL_ERROR_SYS_CALL 的接收函数中出现错误。根据 SSL 文档,这就是它的意思:

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

在我的例子中,ERR_get_error() 返回 0 并且 ret == 0。这意味着“

观察到违反协议的 EOF。

你知道这是什么意思吗?我不明白。为了解决这个问题,我需要检查或做什么?

谢谢

4

2 回答 2

1

雷米的回答是正确的,但让我澄清一下并扩展一下。

, SSL_do_handshake(), SSL_connect(), SSL_accept(),或在调用返回后返回 0SSL_write()且实际为0 的情况意味着对等方关闭了 TCP 连接,例如通过调用而没有正确关闭 SSL。这是一种完全正常且常见的情况,但就 TLS/SSL 而言,它并不是一种优雅的断开连接。因此,违反 SSL 协议的是 EOF。SSL_read()SSL_shutdown()SSL_get_error()SSL_ERROR_SYSCALLerrnoclose()

于 2016-08-12T18:56:39.257 回答
-1

这意味着您连接到一个端没有使用 SSL 的对等套接字。connect()仅使用套接字并立即开始调用是不够的SSL_read()。您必须先调用SSL_connect()afterconnect()执行 SSL 握手,然后才能使用SSL_read()and SSL_write()。此外,请确保您连接到正确的端口。一些服务器使用单独的端口进行 SSL 和非 SSL 连接。

于 2012-04-19T08:50:26.827 回答