c++ - 如果winsock2套接字是非阻塞的,与其关联的SSL对象是否也会表现出非阻塞行为?

标签 c++ c sockets openssl winsock2

我问这个问题是因为我不确定 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并设置非阻塞模式)

感谢您花时间阅读本文。非常感谢。

最佳答案

If my assumption is correct, does that mean if the socket is non-blocking, the SSL is as well?

是的。

Is a winsock tcp socket non-blocking by default (assuming I have created a TCP socket, but have not called ioctlsocket and set non-blocking mode)

Unix 套接字默认是阻塞的。没用过Winsock。但我确信 Winsock 默认情况下应该是阻塞的。

关于c++ - 如果winsock2套接字是非阻塞的,与其关联的SSL对象是否也会表现出非阻塞行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29805785/

相关文章:

c++ - 使用 _wtol 与小数转换

c++ - CMake(忍者后端)用/MT编译

c - 信号量中的 P(&sem) 和 V(&sem) 对代码有何影响?

c - C 中的奇异值分解 (SVD)

java - 使用 Socket 将 PHP 转为 Java

c++ - 在 c header 中使用来自 c++ header 的枚举类

c++ - 如何访问 std::string 内的 char 数组?

c - 访问 union 的内部变量

java - 执行 SSL TLS 客户端服务器 Java 程序时出现问题

c++ - 使用 std::thread 从 C++11 中的两个类调用函数