我们已经使用TLS OpenSSL的实现。 虽然从服务器下载较大的数据越来越SSL_ERROR_SYSCALL
错误接收的一些数据之后。 对于较小的文件,我没有得到这个错误,能下载没有任何错误。 ERR_get_error()是表示零的文件。
我们正在使用Linux和C ++的框架。 如何找到失败的原因? 可能是什么失败的原因是什么? 请提供您的建议。
我们已经使用TLS OpenSSL的实现。 虽然从服务器下载较大的数据越来越SSL_ERROR_SYSCALL
错误接收的一些数据之后。 对于较小的文件,我没有得到这个错误,能下载没有任何错误。 ERR_get_error()是表示零的文件。
我们正在使用Linux和C ++的框架。 如何找到失败的原因? 可能是什么失败的原因是什么? 请提供您的建议。
SSL_ERROR_SYSCALL表明,一些问题发生与底层的I / O(应该是TCP在这种情况下)。 所以,你可以尝试用错误号检查。
OpenSSL的帮助,说:
SSL_ERROR_SYSCALL
发生了一些I / O错误。 OpenSSL的错误队列可以包含关于错误的详细信息。 如果错误队列是空的(即ERR_get_error()返回0),RET可以用来找到更多关于该错误:如果保留== 0,一个EOF观察到违反协议。 如果沤== -1,潜在的BIO报告I / O错误(套接字I / Unix系统O,请参阅错误号的详细信息)。
检查您是否具有为0的缓冲区大小调用SSL_read()我已经使用SSL_pending()以下错误:
int waitForReadFd = nBuf < bufSize;
if (waitForReadFd)
FD_SET(fd, &rfds);
// ...
// select
int doReadFd = FD_ISSET(fd, &rfds) || SSL_pending(ssl);
if (doReadFd)
n = SSL_read(ssl, buf, bufSize - nBuf);
如果nBuf == bufSize
SSL_read()将与0缓存大小是什么导致,并将errno == 0 SSL_ERROR_SYSCALL被调用。
更改doReadFd检查将避免这个问题:
int doReadFd = FD_ISSET(fd, &rfds) || nBuf < bufSize && SSL_pending(ssl);
如果你考虑的源代码SSL_get_error()
你会看到,它返回SSL_ERROR_SYSCALL
时,它不知道到底发生了什么。 它基本上是默认返回代码为“未知”的情况。
例如,在我的情况(做非阻塞IO用BIO):
int buf;
const int n = SSL_read(ssl, &buf, 0);
const int err = SSL_get_error(ssl, n);
const int st = ERR_get_error();
当n
为0, err
会SSL_ERROR_SYSCALL
只是因为。 然而st
仍是0,表明没有真正的错误。 SSL_read
因为0字节写入到刚刚返回0 buf
。
然而,寻找errno
/ WSAGetLastError()
呼吁更多的细节后的值。
问题是由被切断网络连接和服务器重新设置造成的。
只要确保连接下载数据之前确定。
类似的问题可以在这里使用的流浪汉时可以看到。
https://github.com/hashicorp/vagrant/issues/9612
我发现这个问题是我公司的防火墙阻止请求。 回家,它应该工作