C ++应用程序中的SSL错误SSL_ERROR_SYSCALL

时间:2012-04-19 08:23:08

标签: c++ networking ssl openssl

在我的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。

你知道这意味着什么?我不明白。我需要检查或做什么来解决这个问题?

感谢

2 个答案:

答案 0 :(得分:0)

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

_context.SalesOrders.AddRange(salesOrders); _context.SalesOrderDetails.AddRange(salesOrders[0].OrderDetails); _context.SalesOrderDetails.AddRange(salesOrders[1].OrderDetails); _context.SaveChanges(); SSL_do_handshake()SSL_connect()SSL_accept()SSL_write()SSL_read()在调用{{1}后返回0时的情况返回SSL_shutdown(),实际SSL_get_error()为0表示对等关闭TCP连接,例如通过在没有正确SSL关闭的情况下调用SSL_ERROR_SYSCALL。 这是一种完全正常和常见的情况,但就TLS / SSL而言,它并不是一种优雅的断开连接。因此,EOF违反了SSL协议。

答案 1 :(得分:-1)

这意味着您已连接到未在其末端使用SSL的对等套接字。仅connect()套接字并立即开始调用SSL_read()是不够的。您必须在SSL_connect()之后致电connect()以执行SSL握手,然后才能使用SSL_read()SSL_write()。此外,请确保连接到正确的端口。某些服务器使用单独的端口进行SSL和非SSL连接。