2016-10-02 5 views
0

私はSSLソケットを 'select()'を使って複数の接続を管理するように設定しようとしていますが、動作させることができませんでした。 現在、接続は受け入れられていますが、ブロックされているため、サーバーは各要求を一度に読み取ることしかできません。OpenSSLソケットでselect()を使用しますか?

コード:

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 + non-blockingを検索するときにそこにたくさんの情報を見ることも良い考えです。 –

+0

私は 'crl'アプリが例を提供すると信じています。 '/apps/crl.c'をチェックしてください。 – jww

答えて

1

最初に読み取ったSSL_accept()。 2番目はSSL_accept()を呼び出す前にノンブロッキングBIOを使用します。 第3に、ノンブロッキングBIOを使用した後は、受け入れた接続ソケット(client)をselectコールに追加し、clientソケットにアクティビティがある場合にのみ対処してください。その場合は状態を維持する必要があります。

現在の実装はDOS attackです。

+0

これをより安全にするにはどうすればよいですか? –

+0

最初の3つの手順で正確に説明しました。あなたはこの[SO投稿]を見てください(http://stackoverflow.com/questions/1744523/ssl-accept-with-blocking-socket)。あなたがさらに質問があれば、このコードを書いてこのウェブサイトに戻ってきてください – PnotNP

関連する問題