Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenSSL连接因非阻塞套接字而失败_C++_Sockets_Ssl_Openssl_Nonblocking - Fatal编程技术网

C++ OpenSSL连接因非阻塞套接字而失败

C++ OpenSSL连接因非阻塞套接字而失败,c++,sockets,ssl,openssl,nonblocking,C++,Sockets,Ssl,Openssl,Nonblocking,我有一个OpenSSL服务器,它具有如上所述的echo功能,还有一个客户端。我对服务器做了一些小的更改(例如,更改证书和私钥路径,添加更多调试输出…),在客户端,我只是删除了“BIO*out”,并将BIO_读取结果打印到控制台。 此外,客户端和服务器分别使用TLSv1_1_客户端方法和TLSv1_1_服务器方法 这些代码一起工作很好,但是如果我在BIO_do_connect之前向客户端添加“BIO_set_nbio(web,1);”,那么连接就不再工作了。BIO_do_connect返回-1。这

我有一个OpenSSL服务器,它具有如上所述的echo功能,还有一个客户端。我对服务器做了一些小的更改(例如,更改证书和私钥路径,添加更多调试输出…),在客户端,我只是删除了“BIO*out”,并将BIO_读取结果打印到控制台。 此外,客户端和服务器分别使用TLSv1_1_客户端方法和TLSv1_1_服务器方法

这些代码一起工作很好,但是如果我在BIO_do_connect之前向客户端添加“BIO_set_nbio(web,1);”,那么连接就不再工作了。BIO_do_connect返回-1。这是否是握手问题?如果是,如何使用非阻塞套接字正确握手

这个错误首先发生在我的一个更大的项目中。我只是使用示例代码来验证它。我的问题是,我需要非阻塞套接字,因为我从另一个线程调用BIO_read,如果线程在尝试读取时卡住,我就无法加入该线程

我还尝试使用fd_set和select将套接字设置为非阻塞,但这会抛出WSAENOTSOCK错误(10038)。我做了以下工作:

标题:

BIO* _bio;
SSL* _ssl;
FD_SET _fdSet;
SOCKET _socket;
timeval t;
关于连接:

_bio = BIO_new_ssl_connect(_ctx);
BIO_get_ssl(_bio, &_ssl);
SSL_set_mode(_ssl, SSL_MODE_AUTO_RETRY);
BIO_set_conn_hostname(_bio, _address); // _address is "hostname:port"
int connectResult = BIO_do_connect(_bio);

// ... error handling for connect, certificate verification

BIO_get_fd(_bio, _socket);
FD_ZERO(&_fdSet);
FD_SET(_socket, &_fdSet);
t.tv_sec = 2;
t.tv_usec = 0;
在轮询套接字的线程中:

int selectResult = select(0, &fdSet, NULL, NULL, &t); // <-- throws WSAENOTSOCK
if (selectResult > 0)
    x = BIO_read(_bio, &buf, 1);
int-selectResult=select(0,&fdSet,NULL,NULL,&t);//0)
x=生物读数(&buf,1);
如果你有一个生物插座,选择是可行的吗


客户端在Windows 7 64位上,服务器在与我的Windows 7相同的主机上的虚拟机上运行Ubuntu 64位。

如果轮询是从另一个线程完成的,在它进入选择之前,如何确保确实存在有效的套接字?我在一个名为“connect”的函数中创建套接字只有在成功连接并验证证书后,此函数才会启动线程(用于发送和接收)。我希望OpenSSL在使用std::thread处理类成员函数时不会有问题?我不认为会有问题,我对boost线程也做过同样的事情。但我确实认为必须为每个选择重新创建FD_集。此外,还必须重置超时,因为select实际上修改了该参数值。不幸的是,如果我将最后5个命令从select上方的“连接”块中移到右上方,仍然会出现错误10038(WSAENOTSOCK)。你是怎么做到的?我没有用BIO-hell:p,而是用libssh2。我确实看过生物材料,但一切似乎都很复杂。因此,也许我应该补充我之前的陈述,我做了几乎相同的事情——只是使用了不同的库:|我的坏。