BIO_read在阻塞套接字上返回SSL_ERROR_NONE错误,是什么导致的?
创始人
2024-12-19 02:30:38
0

BIO_read是OpenSSL库中的函数,用于从BIO对象中读取数据。当使用阻塞式套接字作为BIO对象时,有时会出现BIO_read返回SSL_ERROR_NONE错误的情况。这种情况通常是因为SSL握手过程中出现了阻塞,导致BIO_read在等待握手完成后才能开始读取数据。

解决方法是使用非阻塞套接字,并使用SSL_set_fd函数将其与SSL句柄绑定。然后将SSL_set_mode函数的第二个参数设置为SSL_MODE_ENABLE_PARTIAL_WRITE,以允许SSL握手期间的部分写入操作。最后使用select函数或epoll函数检查套接字是否就绪,如果就绪则调用BIO_read读取数据。

代码示例:

//创建非阻塞套接字
int sock = socket(AF_INET, SOCK_STREAM, 0);
fcntl(sock, F_SETFL, O_NONBLOCK);

//将套接字与SSL句柄绑定
SSL_CTX* ctx = SSL_CTX_new(SSLv23_client_method());
SSL* ssl = SSL_new(ctx);
SSL_set_fd(ssl, sock);

//设置SSL_MODE_ENABLE_PARTIAL_WRITE模式
SSL_set_mode(ssl, SSL_MODE_ENABLE_PARTIAL_WRITE);

//等待套接字就绪并调用BIO_read读取数据
while(1) {
  fd_set readfds;
  FD_ZERO(&readfds);
  FD_SET(sock, &readfds);

  int ret = select(sock + 1, &readfds, NULL, NULL, NULL);
  if(ret == -1) {
    //error handling
  } else if(ret == 0) {
    //timeout
  } else if(FD_ISSET(sock, &readfds)) {
    char buf[1024];
    int len = BIO_read(SSL_get_rbio(ssl), buf, sizeof(buf));
    if(len > 0) {
      //handle data
    } else if(len == 0) {
      //peer closed connection
    } else if(len < 0) {
      int ssl_err = SSL_get_error(ssl, len);
      if(ssl_err == SSL_ERROR_WANT_READ || ssl_err == SSL_ERROR_WANT_WRITE) {
        //need more data to complete SSL handshake
      } else {
        //error handling
      }
    }
  }
}

相关内容

热门资讯

红龙扑克辅助器!红龙扑克电脑模... 红龙扑克辅助器!红龙扑克电脑模拟器,(红龙扑克)真是真的有挂(详细辅助工具教程)是一款可以让一直输的...
微扑克辅助软件!微扑克有保险吗... 微扑克辅助软件!微扑克有保险吗,(微扑克游戏)其实是有挂(详细全自动机器人教程);一、微扑克辅助软件...
德扑自定义!德扑线上创建房间,... WePoker透视辅助版本稳定性对比与推荐‌:德扑自定义!德扑线上创建房间,德扑之星ai代打原来是有...
德扑之星比赛!德扑软件决策,德... 德扑之星比赛!德扑软件决策,德扑开发真是是真的有挂(详细ai代打教程);亲真的是有正版授权,小编(透...
德州ai辅助软件!德扑之星开桌... 德州ai辅助软件!德扑之星开桌怎么设置,德扑之星ai软件其实有挂(详细功能教程);德州ai辅助软件软...
aapoker透明挂!wepo... 【福星临门,好运相随】;aapoker透明挂!wepoke有软件吗(Wepoke是真的)本来是真的有...
德扑ai软件!德扑人工智能软件... 德扑ai软件!德扑人工智能软件,德扑之星内部都是真的有挂(详细有挂吗教程);超受欢迎的稳赢小游戏,经...
微扑克有辅助挂!微扑克有辅助挂... 微扑克有辅助挂!微扑克有辅助挂吗,(微扑克苹果版)都是存在有挂(详细有辅助挂教程);是一款可以让一直...
we辅助poker德之星!wo... 1、we辅助poker德之星!wopoker游戏辅助器(wepoke)本来存在有挂(详细透明挂教程)...
红龙扑克辅助!红龙扑克是正规的... 红龙扑克辅助!红龙扑克是正规的吗,(红龙扑克)确实真的有挂(详细辅助教程);是一款可以让一直输的玩家...