C 混合使用openssl API和BSD套接字API

C 混合使用openssl API和BSD套接字API,c,sockets,unix,openssl,portability,C,Sockets,Unix,Openssl,Portability,我正在编写一个客户端,它必须同时处理普通http协议和https,以实现安全连接。对于普通http连接,我应该使用基本的套接字I/O函数,如send()、recv()等。但是对于https连接,我应该使用OpenSSL库中的SSL_read()、SSL_write和其他函数。目前我使用以下方法: if (isHTTPS) { /* use OpenSSL calls */ SSL_write(); } else { /* use basic socket I/O func

我正在编写一个客户端,它必须同时处理普通http协议和https,以实现安全连接。对于普通http连接,我应该使用基本的套接字I/O函数,如send()、recv()等。但是对于https连接,我应该使用OpenSSL库中的SSL_read()、SSL_write和其他函数。目前我使用以下方法:

if (isHTTPS)
{
    /* use OpenSSL calls */
    SSL_write();
}
else
{
    /* use basic socket I/O functions */
    send();
}
但我认为这不是一个好方法,因为用这种方法编写代码并不容易。有什么建议吗?有更好的方法吗?

您描述的是使用OpenSSL的传统API模型。
SSL
对象拥有套接字并对其执行所有I/O,因此在执行安全I/O时必须使用
SSL\u read()
SSL\u write()
函数

OpenSSL还有一个更新的API模型,它使用了
BIO
结构。您可以为套接字创建
BIO
对象,然后仅在需要安全I/O时将
SSL
对象与其关联,然后使用
BIO_…()
函数(
BIO_read()
BIO_write()
等)在安全模式下处理实际I/O,
BIO
函数将在内部为您使用
SSL
函数:

bio = BIO_new_connect(...); // host/IP and port
if (IsHTTPS)
    BIO_set_ssl(bio, ssl, ...);

// alternatively:
if (IsHTTPS)
{
    bio = BIO_new_ssl_connect(sslCtx);
    BIO_set_connect_hostname(...); // host/IP and port
    ...    
}
else
    bio = BIO_new_connect(...); // host/IP and port

BIO_do_connect(bio);
...    

BIO_read(bio, ...);
...    

BIO_write(bio, ...);
...    

BIO_free(bio);
如果您想要执行自己的套接字I/O(即,对于重叠/异步套接字),那么您也可以使用这个BIO API,让OpenSSL只处理它的安全性。您将创建一个将两个内存缓冲区链接在一起的
BIO
。然后,您可以将入站数据从套接字读取到一个缓冲区中,让OpenSSL使用
BIO_read()
,并使用
BIO_write()
写入出站数据。OpenSSL生成的任何传出数据都将放在另一个缓冲区中,然后您可以根据需要将该缓冲区写入套接字