Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 选择返回后SSL\u读取超时_C_Ssl_Openssl - Fatal编程技术网

C 选择返回后SSL\u读取超时

C 选择返回后SSL\u读取超时,c,ssl,openssl,C,Ssl,Openssl,我有一个使用C处理ssl的程序,步骤如下: retval = select(maxfd + 1, &rfds, NULL, NULL, &tv); if (retval == -1) { //report error } else if (retval == 0) { // timeout and reconnect } else { do { memset(buf, 0, buf_len); count

我有一个使用C处理ssl的程序,步骤如下:

 retval = select(maxfd + 1, &rfds, NULL, NULL, &tv);
 if (retval ==  -1) {
      //report error
 } else if (retval == 0) {
     // timeout and reconnect

 } else {
     do {
        memset(buf, 0, buf_len);
        count = SSL_read((SSL*)conn->ssl, buf, (int)buf_len);
        if (count <= 0) {
           error("ssl error is %d", SSL_get_error((SSL*)conn->ssl, count))
           error("an error: %s",  strerror(errno));
           break;
         }

      } while (conn->ssl && SSL_pending((SSL *)conn->ssl));

}
retval=select(maxfd+1,&rfds,NULL,NULL,&tv);
如果(retval==-1){
//报告错误
}else if(retval==0){
//超时并重新连接
}否则{
做{
memset(buf,0,buf_len);
count=SSL\u read((SSL*)conn->SSL,buf,(int)buf\u len);
如果(计数ssl,计数))
错误(“错误:%s”,strerror(errno));
打破
}
}而(conn->ssl&&ssl_挂起((ssl*)conn->ssl));
}
在某些情况下,SSL_读取的返回值为<0,错误号为5,错误字符串为读取SSL超时。

为什么选择指示套接字已准备好读取,但SSL\U读取超时?如何正确使用select和SSL\u读取?谢谢。

仅选择表示套接字上有要读取的内容。这可能不是什么(即对等闭合连接)或某些数据。但对于SSL,您需要的不仅仅是数据。有效负载封装在SSL帧中,SSL_read只能在读取完整帧后解密帧并返回有效负载。还有一些控制帧(如握手或心跳…)根本不包含任何有效负载

因此,如果select返回套接字已就绪,则可能发生以下情况:

  • 连接关闭:在这种情况下,SSL_读取将返回一个错误
  • SSL帧不完整:SSL_读取将只是(阻塞)等待更多数据。它可能会在读取超时后返回
  • 控制帧:SSL_读取将等待更多实际包含有效负载的帧,并且可能在读取超时后返回

您是否使用非阻塞插座?套接字操作是否超时?