使用OpenSSL库的IMAP客户端

使用OpenSSL库的IMAP客户端,openssl,imap,Openssl,Imap,我正在尝试编写一个简单的SSL IMAP客户端。为此,我使用OpenSSL库和C++(G+编译器)。我发现了很多关于IMAP的信息,我可以成功地与IMAP服务器通信。但我注意到,当没有数据接收时,BIO_read()会永远阻塞。通过查看示例(我没有使用证书验证),我还尝试了在非阻塞(?)模式下使用SSL_read(),并得到了相同的问题 简化源代码: <...> BIO *bio; SSL *ssl; SSL_CTX *ctx; CRYPTO_malloc_init(); // I

我正在尝试编写一个简单的SSL IMAP客户端。为此,我使用OpenSSL库和C++(G+编译器)。我发现了很多关于IMAP的信息,我可以成功地与IMAP服务器通信。但我注意到,当没有数据接收时,BIO_read()会永远阻塞。通过查看示例(我没有使用证书验证),我还尝试了在非阻塞(?)模式下使用SSL_read(),并得到了相同的问题

简化源代码:

<...>
BIO *bio;
SSL *ssl;
SSL_CTX *ctx;

CRYPTO_malloc_init(); // Initialize malloc, free, etc for OpenSSL's use
SSL_library_init(); // Initialize OpenSSL's SSL libraries
SSL_load_error_strings(); // Load SSL error strings
ERR_load_BIO_strings(); // Load BIO error strings
OpenSSL_add_all_algorithms(); // Load all available encryption algorithms

ctx = SSL_CTX_new(SSLv23_client_method());
bio = BIO_new_ssl_connect(ctx);
BIO_get_ssl(bio, &ssl);
SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);

BIO_set_conn_hostname(bio, "imap.gmail.com:993");
BIO_do_connect(bio);

char tmp[10000];
cout << "Bytes received: " << BIO_read(bio, tmp, 1000) << endl; //Got 68 bytes - full anwer (server welcome string)
cout << "Bytes received: " << BIO_read(bio, tmp, 1000) << endl; //No more data to receive - I expecting 0 (zero), but it blocks forever.
cout << "Bytes received: " << BIO_read(bio, tmp, 1000) << endl;

生物*生物;
SSL*SSL;
SSL_CTX*CTX;
CRYPTO_malloc_init();//初始化malloc、free等以供OpenSSL使用
SSL_库_init();//初始化OpenSSL的SSL库
SSL_加载_错误_字符串();//加载SSL错误字符串
ERR_load_BIO_strings();//加载BIO错误字符串
OpenSSL_添加_所有算法();//加载所有可用的加密算法
ctx=SSL_ctx_new(SSLv23_client_method());
bio=bio\U新\U ssl\U连接(ctx);
BIO_get_ssl(BIO和ssl);
SSL设置模式(SSL、SSL模式自动重试);
BIO_set_conn_主机名(BIO,“imap.gmail.com:993”);
BIO_do_connect(BIO);
char-tmp[10000];
不能尝试使用来确定是否应该执行另一个BIO_读取

比如:

while (bytes_remaining = BIO_pending(bio))
cout << "Bytes received: " << BIO_read(bio, tmp, bytes_remaining) << endl;
while(剩余字节=BIO\u挂起(BIO))
库特