У меня такая же проблема.Я должен написать неблокирующий сервер TLS, используя IPV6.В основном это то, что вы хотите использовать:
/* Create a socket BIO attached to an already existing socket
* descriptor. The socket descriptor will be closed when the BIO is
* destroyed. */
bio = BIO_new_socket(sd, BIO_CLOSE);
Конечно, как говорится, сначала нужно создать сокет.Это взято из "Сетевая безопасность с OpenSSL", которая немного устарела.Вам нужна эта книга для правильного использования OpenSSL, получите ее.
Это особенно расстраивает, что нет прямой поддержки IPV6, потому что интерфейс сокета IPV6 BSD (как бы он ни был ужасен - столь же ужасен, как и интерфейс IPV4)на 100% совместим с IPV4.На самом деле, я даже больше не программирую, используя структуры IPV4, так как я изучил интерфейс библиотеки BSD IPV6.
Адреса IPV4 просто :: ffff: xxx.xxx.xxx.xxx - где xxx.xxx.xxx.xxx - это адрес IPV4.Вот функция, которая преобразует struct in_addr в struct in6_addr:
/////////////////////////////////////////////////////////
// NOTE: it's safe for ((void *)pin) == ((void*) pout) //
/////////////////////////////////////////////////////////
struct in6_addr *sockaddr_in_to_6 (struct in_addr *pin, struct in6_addr *pout)
{
// as IPV6 IPV4 address is stored as 0000:0000:0000:0000:0000:FFFF:AABB:CCDD
// where IPV4 address is AA.BB.CC.DD
pout->s6_addr[0x0c] = ( (struct in6_addr *)pin)->s6_addr[0x00];
pout->s6_addr[0x0d] = ( (struct in6_addr *)pin)->s6_addr[0x01];
pout->s6_addr[0x0e] = ( (struct in6_addr *)pin)->s6_addr[0x02];
pout->s6_addr[0x0f] = ( (struct in6_addr *)pin)->s6_addr[0x03];
pout->s6_addr[0x00] = 0x00;
pout->s6_addr[0x01] = 0x00;
pout->s6_addr[0x02] = 0x00;
pout->s6_addr[0x03] = 0x00;
pout->s6_addr[0x04] = 0x00;
pout->s6_addr[0x05] = 0x00;
pout->s6_addr[0x06] = 0x00;
pout->s6_addr[0x06] = 0x00;
pout->s6_addr[0x07] = 0x00;
pout->s6_addr[0x08] = 0x00;
pout->s6_addr[0x09] = 0x00;
pout->s6_addr[0x0a] = 0xFF;
pout->s6_addr[0x0b] = 0xFF;
return pout;
}
Вам больше никогда не понадобится использовать struct in_addr с этим, и она полностью совместима с IPV4.При использовании адреса IPV4, закодированного в структурах IPV6, фактический сетевой трафик все еще остается IPV4 - по крайней мере, в Linux.