簡體   English   中英

如果winsock2套接字是非阻塞的,與之關聯的SSL對象是否也會表現出非阻塞的行為?

[英]If a winsock2 socket is non-blocking, would an SSL object associated with it also exhibit non-blocking behavior?

我問這個問題是因為我不確定SSL對象是否像對待BIO對象一樣將套接字視為消息的接收器/源。 我的直覺告訴我是的,但我不確定。

目標:我正在將SSL身份驗證集成到已經存在的TCP代碼中。 我不想調用常規的send()/ receive(),而是通過OpenSSL的SSL_read()/ SSL_write()定向消息。 我的另一個要求是通信是非阻塞的,並且可以部分發送數據。

這是我將SSL對象與套接字(服務器代碼)相關聯的方法。

SSL_Init(std::wstring &peer_hostname, SOCKET sock){
        //...
        //Initialize SSL structure
                ssl = SSL_new(context);
                if (ssl == NULL){
                    mr = APPZRETURN(E_FAIL, L"%ls (%d) : SSL_new failed. Unable to create SSL structure", __FUNCTIONW__, __LINE__);
                }

                //Agent uses winsock class, but OpenSSL uses unix socket. Surpressed warning added here for 4244. It works
                if (SSL_set_fd(ssl, sock) == 0){    //set file descriptor for ssl
                    //Operation failed
                    return -1;
        }
        //...
        int status = SSL_accept(ssl);   
        SSL_set_mode(ssl, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER|SSL_MODE_ENABLE_PARTIAL_WRITE);
        //...
    }

根據SSL_read()的文檔[ https://www.openssl.org/docs/ssl/SSL_read.html] ,如果基礎BIO是非阻塞的,則SSL是非阻塞的。 如果我的假設是正確的,那是否意味着如果套接字是非阻塞的,那么SSL也是如此?

我的問題的擴展 :默認情況下,winsock tcp套接字是非阻塞的(假設我已經創建了一個TCP套接字,但是沒有調用ioctlsocket並設置了非阻塞模式)

感謝您抽出時間來閱讀。 非常感謝。

如果我的假設是正確的,那是否意味着如果套接字是非阻塞的,那么SSL也是如此?

是。

默認情況下,winsock tcp套接字是非阻塞的(假設我已經創建了一個TCP套接字,但是沒有調用ioctlsocket並設置了非阻塞模式)

Unix套接字默認情況下處於阻塞狀態。 還沒用過Winsock。 但是,請確保Winsock默認情況下應處於阻止狀態。

嘗試以下代碼:

   SSL_set_fd(ss, sock);
retry:
   int ret = SSL_accept(ssl);
   if (ret != 1) {
      int err = SSL_get_error(ssl, ret);
      if (err == SSL_ERROR_WANT_READ || SSL_ERROR_WANT_WRITE) {
         // maybe need some sleep or select
         goto retry;
      }
   }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM