Google api sheets.googleapis.com非阻塞插座的SSL_连接

Google api sheets.googleapis.com非阻塞插座的SSL_连接,google-api,openssl,Google Api,Openssl,以下使用OpenSSL连接https页面的方法似乎适用于大多数页面,但不适用于sheets.googleapis.com // initialize OpenSLL SSL_library_init(); SSL_load_error_strings(); SSL_CTX* ctx = SSL_CTX_new(SSLv23_client_method()); // create context SSL_CTX_set_ecdh_auto(ctx, 1); wstring strHostn

以下使用OpenSSL连接https页面的方法似乎适用于大多数页面,但不适用于sheets.googleapis.com

 // initialize OpenSLL
SSL_library_init();
SSL_load_error_strings();
SSL_CTX* ctx = SSL_CTX_new(SSLv23_client_method());


// create context
SSL_CTX_set_ecdh_auto(ctx, 1);

wstring strHostname = L"sheets.googleapis.com";
wstring strPort = L"443";

SOCKET s = http_server_connect(strHostname, strPort);

// make socket non blocking for the timeout
unsigned long mode = 1;
ioctlsocket(s, FIONBIO, &mode);

SSL* ssl = SSL_new(ctx);
SSL_set_fd(ssl, (int)s);

int res = SSL_ERROR_NONE;

while ((res = SSL_connect(ssl)) != 1)
{
    int error = SSL_get_error(ssl, res);

    fd_set fds;
    FD_ZERO(&fds);
    FD_SET(s, &fds);

    switch (error)
    {
    case SSL_ERROR_WANT_READ:
        select(int(s + 1), &fds, NULL, NULL, NULL);
        break;
    case SSL_ERROR_WANT_WRITE:
        select(int(s + 1), NULL, &fds, NULL, NULL);
        break;

    case SSL_ERROR_SYSCALL:
        printf("SSL_ERROR_SYSCALL\n");
        break;
    }

}
运行此代码时,第一个
SSL\u connect
显示预期的
SSL\u错误\u WANT\u READ
,第二个调用不显示和错误。但是,通过使用Wireshark检查连接,您会看到服务器正在重置连接。使用阻塞套接字可以毫无问题地工作

我知道有一个问题的内容与上面的代码所回答的内容几乎相同,但无论出于何种原因,这对GoogleAPI页面都不起作用。有人知道如何克服这个问题吗


我已经在各种OpenSSL版本上测试了它,包括最新的1.1.1d,同时我也解决了这个问题。我必须通过
ssl\u set\u tlsext\u host\u name
设置ssl连接的主机名

有趣的是,这些信息似乎被缓存了。稍后删除该命令后,代码仍然有效