#include <openssl/bio.h> BIO_METHOD *BIO_s_socket(void); long BIO_set_fd(BIO *b, int fd, long close_flag); long BIO_get_fd(BIO *b, int *c); BIO *BIO_new_socket(int sock, int close_flag);
BIO_read() and BIO_write() read or write the underlying socket. BIO_puts() is supported but BIO_gets() is not.
If the close flag is set then the socket is shut down and closed when the BIO is freed.
BIO_set_fd() sets the socket of BIO b to fd and the close flag to close_flag.
BIO_get_fd() places the socket in c if it is not NULL, it also returns the socket. If c is not NULL it should be of type (int *).
The reason for having separate file descriptor and socket BIOs is that on some platforms sockets are not file descriptors and use distinct I/O routines, Windows is one such platform. Any code mixing the two will not work on all platforms.
BIO_set_fd() always returns 1.
BIO_get_fd() returns the socket or -1 if the BIO has not been initialized.