2016-10-02 31 views
0

我试图配置我的SSL套接字使用'select()'来管理多个连接,但是我一直无法让它工作。 当前连接正在接受,但是它们被阻塞,因此服务器一次只能处理读取每个请求。使用select()与OpenSSL套接字?

代码:

int main(int argc, char **argv) 
{ 
    int sock; 
    SSL_CTX *ctx; 

    init_openssl(); //Load dependencies 
    ctx = create_context(); //Set Protocol 

    configure_context(ctx); //Set key/cert 

    sock = create_socket(3000); //Configure and bind listener 

    fd_set active_fd_set, read_fd_set; 
    timeval t; 

    FD_ZERO(&active_fd_set); //initialise fd active 
    FD_SET(sock,&active_fd_set); //includes sock in the fd 

    while(1) 
    { 
     int i; 
     struct sockaddr_in addr; 
     uint len = sizeof(addr); 
     SSL *ssl; 

     read_fd_set=active_fd_set; 

     if(select(FD_SETSIZE,&read_fd_set,NULL,NULL,NULL)<0) 
     { 
      std::cout<<"Error at select!"<<std::endl; 
     } 

      for(i=0;i<FD_SETSIZE;i++) 
      { 
       if(FD_ISSET(i,&read_fd_set)) //Is fd part of the set 
       { 
        if(i==sock) 
        { 

         int client = accept(sock,(struct sockaddr*)&addr,&len); 
         if(client>0){std::cout<<"Client accepted"<<std::endl;}else{std::cout<<"Client failed"<<std::endl;} 
         ssl = SSL_new(ctx); //Create new ssl structure for connection 
         SSL_set_fd(ssl, client); 
         FD_SET(client,&active_fd_set); 
         if(SSL_accept(ssl)>0) 
         { 
          std::cout<<"ACCEPTED"<<std::endl;   
         } 
        } 
        else 
        { 
         if(SSL_accept(ssl)>0) 
         { 
          std::cout<<"Down here"<<std::endl; 
          close(i); 
          FD_CLR(i,&active_fd_set); 
         } 
        } 
       } 
      } 
    } 

有没有人对如何获得选择任何提示()工作?

+1

我建议您实际阅读SSL_accept,SSL_read等文档,以及在哪些情况下返回哪些错误代码。根据错误代码,您应该使用select。当搜索openssl +非阻塞而不是期待其他人为您收集所有这些信息时,查看大量信息可能也是一个好主意。 –

+0

我相信'crl'应用程序提供了一个例子。登入'/apps/crl.c'。 – jww

回答

1

首先阅读SSL_accept()。在调用SSL_accept()之前,请使用非阻塞BIO。第三,一旦您使用非阻塞BIO,您应该将接受的连接套接字(client)添加到select调用中,并且只有在client套接字上有任何活动时才会采取行动。在这种情况下你必须保持状态。

您目前的执行情况为DOS attack

+0

我该如何使这更安全? –

+0

在前三个步骤中我完全是这样提到的。你应该看看这个[SO帖](http://stackoverflow.com/questions/1744523/ssl-accept-with-blocking-socket)。如果您有任何进一步的问题,请开始编写该代码并返回到本网站 – PnotNP

相关问题