SSL_connect()不能与select()一起使用

时间:2014-04-16 08:14:57

标签: c++ sockets networking openssl nonblocking

我有一个非阻塞套接字,我使用openssl创建一个ssl连接。我的问题是SSL_connect的工作方式。在这些情况下,它返回SSL_ERROR_WANT_READ或SSL_ERROR_WANT_WRITE,必须再次调用SSL_connect。现在这实际上是有效的。我遇到的问题是,应该使程序等待套接字准备就绪的select()不起作用。这导致超过2000次调用SSL_connect,这是不好的。

以下是本部分程序的代码

 int test = 0;
        while (test != 1) {
            test = SSL_connect(sslHandle);
            if (test != 1) { //test again or we would quit if we made a connection
                if (SSL_get_error(sslHandle, test) != SSL_ERROR_WANT_READ && SSL_get_error(sslHandle, test) != SSL_ERROR_WANT_WRITE) {
                    //error happend
                    return -1;
                }
                FD_ZERO(&socketSet); //reset socketSet
                FD_SET(socket, &socketSet); //init socketSet with our socket
                if (test == SSL_ERROR_WANT_READ) {

                    result = select(socket + 1, &socketSet, NULL, NULL, &timeoutCopy); //wait for the socket to be readable
                    if (result == 0) {
                        //timeout
                        return -1; 
                    } else if (result == -1) {
                        //error
                        return -1;
                    }


                } else {

                    result = select(socket + 1, NULL, &socketSet, NULL, &timeoutCopy); //wait for the socket to be writable
                    if (result == 0) {
                       //timeout
                        return -1; 
                    } else if (result == -1) {
                       //error
                        return -1; 
                    }

                }

            }
        }

我删除了所有错误处理内容和日志,因此它更易读。 timeoutCopy在别处定义。我在程序的其他部分使用相同类型的选择它工作得很好。 正如我所说,该计划正在运作,但只是没有等待选择。我可以睡觉,但这不是一个好的解决方案。提前谢谢!

1 个答案:

答案 0 :(得分:1)

好的,我是个假人。 问题在行

 if (test == SSL_ERROR_WANT_READ) 

这必须是

if (SSL_get_error(sslHandle, sslConnectResult) == SSL_ERROR_WANT_READ) 

比代码工作得好。它迭代4到5次而不是连接。