gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:57:43 30 4
gpt4 key购买 nike

为了理解SSL/TLS,我在Windows-7上下载了OpenSSL-1.0.2k并用Cygwin编译 gcc 64 位 编译器。我从 OpenSSL server/client example in c 中获取了服务器/客户端的 现成 示例并用 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

并无限期地等待下一行。

然后我开始调试服务器端,发现​​ void Servlet(SSL* ssl) 过程中的 SSL_accept() 返回值 -1,这不是预期的。我查阅了 OpenSSL 的文档 openSSL DOC ;

The TLS/SSL handshake was not successful because a fatal error occurred either at the protocol level or a connection failure occurred. The shutdown was not clean. It can also occur of action is need to continue the operation for non-blocking BIOs. Call SSL_get_error() with the return value ret to find out the reason.

SSL_get_error() 返回 SSL_ERROR_SYSCALL。我在这次调用后立即检查了 errno 的值,我看到 no errorServlet 方法的完整代码如下。其余代码与链接中的相同。

void Servlet(SSL* ssl) /* Serve the connection -- threadable */
{ char buf[1024];
char reply[1024];
int sd, bytes;
const char* HTMLecho="<html><body><pre>%s</pre></body></html>\n\n";
int ret;
ret = SSL_accept(ssl); /* do SSL-protocol accept */
if ( ret == -1 )
{
// printf(" SSL_accept() returned -1\n");
switch(SSL_get_error(ssl, ret) )
{
case SSL_ERROR_SYSCALL:
perror("errno");
break;
default:
printf( "default" );
break;
}
exit(-1);
}
else if ( ret == 0)
{
printf(" SSL_accept() returned 0\n");
exit(-1);
}
else if ( ret == 1) // The TLS/SSL connection has been established.
{
ShowCerts(ssl); /* get any certificates */
bytes = SSL_read(ssl, buf, sizeof(buf)); /* get request */
if ( bytes > 0 )
{
buf[bytes] = 0;
printf("Client msg: \"%s\"\n", buf);
sprintf(reply, HTMLecho, buf); /* construct reply */
SSL_write(ssl, reply, strlen(reply)); /* send reply */
}
else
ERR_print_errors_fp(stderr);
}
sd = SSL_get_fd(ssl); /* get socket connection */
SSL_free(ssl); /* release SSL state */
close(sd); /* close connection */
}

最佳答案

  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 中,根据您自己引用的文档,这意味着您应该随后跟踪 that。而不是只是举手。请注意,您必须在调用任何其他系统调用(例如 write() 通过 printf() )之前执行此操作,因此可能有助于保存 errno立即。
  4. 您可以打印 errno直接与 printf("errno=%d\n", errno) , 但打印错误消息会更有用,你可以用 perror()printf("error=%s\n", strerror(errno)) .
  5. SSL_get_error() 的值不是 errno值,而且您开始使用的原始 -1 也不是。一个errno值来自 errno变量。
  6. 但是你不应该做任何这些事情除非 SSL_accept()返回 -1,此处没有实际证据。

所以完全有可能这里完全没有错误。

关于sockets - SSL_accept() 失败,返回值 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44259683/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com