2016-10-02 51 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

相關問題