2012-09-07 58 views
1

SSL_accept(ssl)需要200ms是否正常?SSL_accept需要200ms(c/openssl)

作爲windows服務運行,用C++編寫,使用MFC和Boost。運行在具有4GB內存的Intel xeon e5620 2.4G和Win 7 Pro上。

以下是我的代碼。與此同時,懷疑SSL_accept(SSL_CTX_ * RAND_ *等)可能會耗費很長時間的其他方法,但我記錄了並且發現SSL_accept一直在吃東西。

int verify_callback(int preverify_ok, X509_STORE_CTX *ctx) 
{ 
    return preverify_ok; 
}  
void somemethod() {  
    SSL *ssl = 0; 
    SSL_CTX *tlsctx = 0; 
    int ret_conn = -1; 
    tlsctx = SSL_CTX_new(SSLv23_method()); 

    SSL_CTX_use_certificate_file(tlsctx, sCert , SSL_FILETYPE_PEM); 

    SSL_CTX_use_PrivateKey_file(tlsctx, sKey , SSL_FILETYPE_PEM); 

     RAND_write_file(sRandomPem); 
     int _rand_loaded = RAND_load_file(sRandomPem, -1); 

     if(! SSL_CTX_load_verify_locations(tlsctx, sCACert, NULL)) 
     { 
      // TODO // /* Handle error here */  
     } 
     SSL_CTX_set_verify(tlsctx, SSL_VERIFY_PEER, verify_callback); 

     ssl = SSL_new(tlsctx); 

     int _error = SSL_ERROR_WANT_READ; 

     int loopCount = 0; 


     // START MEASURING TIME FROM HERE 
     SSL_set_fd(ssl, _sck); 
     while(ret_conn != 1) 
     { 
      loopCount++; 

      ret_conn = SSL_accept(ssl); 

      _error = SSL_get_error(ssl, ret_conn); 
      switch (_error) 
      { 
      case SSL_ERROR_NONE: 
        break; 
      case SSL_ERROR_WANT_WRITE: 
        break; 
      case SSL_ERROR_WANT_READ: 
        break; 
      case SSL_ERROR_WANT_X509_LOOKUP: 
        break; 
      case SSL_ERROR_SYSCALL: 
        break; 
      case SSL_ERROR_SSL: 
        break; 
      case SSL_ERROR_ZERO_RETURN: 
        break; 
      } 

      if(_error == SSL_ERROR_WANT_READ || _error == SSL_ERROR_WANT_WRITE) 
      { 
       Sleep(1); 
      } else 
      { 
       break; 
      } 
     } 

     if(ret_conn < 1) 
     { 
      Log("SSL_accept -1 ", ERR_error_string(_error, NULL)); 
      return; 
     } 
     // MEASURING END HERE, takes ~200ms (on successfully accepting connection) 
} 

+0

測量是通過文件記錄完成的。 – user1283791

+0

及其運行服務,不在調試模式 – user1283791

回答

1

據我所知,SSL_accept是一個阻塞函數,等待您的客戶端連接。如果您的客戶端連接SSL_accept呼叫晚於開始時間200毫秒,那麼您將測量該等待時間。

+0

它是如何工作的。客戶端連接到偵聽套接字。 SSL_set_fd(ssl,_sck);是「連接」連接到ssl的套接字。所以我相信客戶端連接之間沒有任何延遲---->開始SSL_accept – user1283791

+0

否則,'SSL_accept'可能啓動SSL協商,在這種情況下,您會測量幾次往返和一些昂貴的加密計算,服務器和客戶端。另外,底層套接字是否可以[延遲確認](http://en.wikipedia.org/wiki/TCP_delayed_acknowledgment)? – user1202136