关闭成功的 OpenSSL 连接的正确方法是什么?

问题描述 投票:0回答:1

在 C 代码中(在 Ubuntu 20 Linux 中运行),我已将测试电子邮件发送到 gmail 地址。电子邮件已发送并正常到达收件人。 现在我想正确关闭连接。我的关闭代码如下:

...
if (ctx!=NULL)
   SSL_CTX_free(ctx);
printf("SSL closed!\n");
if (ssl!=NULL)
   {
   i=0;
   while (i<5)
      {
      iResult = SSL_shutdown(ssl);
      if (iResult == 0)
         {
         printf("SSL shutdown in progress...\n");
         iResult=SSL_get_error(ssl,iResult);
         printf("iResult: %d\n",iResult);
         switch (iResult)
            {
            case SSL_ERROR_NONE:  //0
                 break;
            case SSL_ERROR_SSL:   //1
                 break;
            case SSL_ERROR_WANT_READ:   //2
                 iResult = SSL_read(ssl, recvbuf, BUFLEN - 1);
                 if (iResult>0)
                    printf("Byte(s) received: %d\n", iResult);
                 break;
            case SSL_ERROR_WANT_WRITE:   //3
                 break;
            case SSL_ERROR_WANT_X509_LOOKUP:  //4
                 break;
            case SSL_ERROR_SYSCALL:   //5
                 break;
            case SSL_ERROR_ZERO_RETURN:  //6
                 break;
            case SSL_ERROR_WANT_CONNECT:  //7
                 break;
            case SSL_ERROR_WANT_ACCEPT:  //8
                 break;
            case SSL_ERROR_WANT_ASYNC:  //9
                 break;
            case SSL_ERROR_WANT_ASYNC_JOB:  //10
                 break;
            case SSL_ERROR_WANT_CLIENT_HELLO_CB:  //11
                 break;
            default:
                 break;
            }
         }
      else if (iResult == 1)
         {
         printf("SSL shutdown succeeded\n");
         break;
         }
      else if (iResult == -1)
         {
         printf("SSL shutdown failed! %d\n",SSL_get_error(ssl,iResult));
         sleep(1);
         iResult = SSL_shutdown(ssl);
         break;
         }
      sleep(1);
      i++;
      }
   SSL_free(ssl);
   }

//
if (sock>0)
   {
   iResult = shutdown(sock, SHUT_RDWR);
   if (iResult == -1)
      {
      printf("shutdown failed: %d\n", errno);
      }
   else
      printf("shutdown succeeded\n");
   iResult = close(sock);
   if (iResult < 0)
      {
      printf("Error occurred while closing socket\n");
      }
   }

我得到以下输出:

221 2.0.0.0 closing connection..
SSL closed!
SSL shutdown in progress...
iResult: 5
SSL shutdown failed! 5
shutdown failed: 107

错误5是SSL_ERROR_SYSCALL

我尝试了多种方法,但似乎从未克服关机时的错误。 关闭成功会话的正确方法是什么?

c openssl shutdown
1个回答
0
投票

由于这个问题没有答案,而且主题并不容易,我建议阅读这个答案,我发现它非常有用。

© www.soinside.com 2019 - 2024. All rights reserved.