SSL_accept()失败,返回值为-1

时间:2017-05-30 10:26:19

标签: sockets tcp openssl

为了理解type="text/css",我在<style>上下载了type="text/javascript",并使用<script> SSL/TLS OpenSSL-1.0.2k编译器进行了编译。我从OpenSSL server/client example in c获取了Windows-7服务器/客户端的示例,并使用Cygwin进行了编译。第一次编译成功。我使用以下命令从gcc执行了服务器和客户端。

64 bit

客户端退出时没有任何响应,但另一方面,服务器显示它已建立连接,例如;

off-the-shelf

无限地等待下一行。

然后我开始调试服务器端,发现​​程序cygwin gcc中的cmd返回值(Server) D:\>ssl-server.exe 5000 (Client) D:\>ssl-client.exe 127.0.0.1 5000 ,这是不期望的。我咨询了Connection: 127.0.0.1:50475 openSSL DOC的文档;

  

TLS / SSL握手未成功,因为在协议级别发生致命错误或发生连接失败。关机不干净。它还可以发生动作,需要继续操作非阻塞BIO。使用返回值ret调用SSL_get_error()以找出原因。

SSL_accept()返回void Servlet(SSL* ssl)。我在调用后立即检查了-1的值,并看到了OpenSSL。完整的SSL_get_error()方法代码如下。其余代码与链接相同。

SSL_ERROR_SYSCALL

1 个答案:

答案 0 :(得分:2)

  1. 当您未点击已枚举的其中一个SSL_ERROR_个案时,您应该追踪SSL_get_error()的值,以便开始调试。而不是只是举手。
  2. 在这种情况下,值为SSL_ERROR_SYSCALL。你没有抓住你认为应该去的地方,因为case (SSL_ERROR_SYSCALL || SSL_ERROR_SSL || SSL_ERROR_WANT_CONNECT || SSL_ERROR_WANT_ACCEPT):没有按你的想法行事。由于case 1的语义,它将变为||。每个值都应该有单独的case语句。
  3. SSL_ERROR_SYSCALL表示基础错误位于errno,根据您自己引用的文档,这意味着您应该跟踪 。而不是只是举手。请注意,在调用任何其他系统调用之前必须执行此操作(例如write()通过printf()),因此可能有助于立即保存errno。 / LI>
  4. 您可以直接使用errno打印printf("errno=%d\n", errno),但打印错误消息会更有用,您可以使用perror()执行此操作或printf("error=%s\n", syserror(errno))
  5. SSL_get_error()的值不是errno值,也不是您开始使用的原始值-1。 errno值来自errno变量。
  6. 但是,除非 SSL_accept()返回-1,,否则你不应该 / em>的
  7. 所以完全有可能在这里没有错误。