Google api sheets.googleapis.com非阻塞插座的SSL_连接
以下使用OpenSSL连接https页面的方法似乎适用于大多数页面,但不适用于sheets.googleapis.comGoogle 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
// 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连接的主机名
有趣的是,这些信息似乎被缓存了。稍后删除该命令后,代码仍然有效