OpenSSL连接失败,非阻塞套接字

时间:2015-04-01 10:12:21

标签: c++ sockets ssl openssl nonblocking

我有一个OpenSSL服务器,它具有如here所述的回送功能和描述为here的客户端。我对服务器做了一些小改动(例如更改certifiacte和私钥路径,添加一些调试输出,......),在客户端我刚删除了“BIO * out”并将BIO_read结果打印到控制台。 客户端和服务器也分别使用TLSv1_1_client_method和TLSv1_1_server_method。

代码可以很好地协同工作,但是如果我添加“BIO_set_nbio(web,1);”在BIO_do_connect之前的客户端,连接不再起作用。 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);

如果您有BIO插座,是否可以选择?

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

0 个答案:

没有答案