在 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
我尝试了多种方法,但似乎从未克服关机时的错误。 关闭成功会话的正确方法是什么?
由于这个问题没有答案,而且主题并不容易,我建议阅读这个答案,我发现它非常有用。