Я пытаюсь использовать сокет IPv6 для подключения к IPv4-адресу с использованием сопоставленного IPv4-адреса IPv6 в linux (debian-lenny-64 2.6.26-2-amd64)
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, void **argv)
{
struct addrinfo *sa;
struct addrinfo *ra;
int err = getaddrinfo("2001:DB8::2", 0, 0, &sa);
int fd = socket(sa->ai_family, SOCK_DGRAM, 0);
int v6only = 0;
err = setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&v6only, sizeof(v6only));
err = bind(fd, sa->ai_addr, sa->ai_addrlen);
err = getaddrinfo("::ffff:192.168.0.1", "9", 0, &ra);
// err = getaddrinfo("2001:DB8::1", "9", 0, &ra);
// err = getaddrinfo("::ffff:127.0.0.1", "9", 0, &ra);
err = connect(fd, (struct sockaddr *)ra->ai_addr, sizeof(struct sockaddr_in6));
}
(я удалил тестирование ошибок из вставленного кода)
2001: DB8 :: 2 и 192.168.0.2 являются локальными адресами (оба на одном интерфейсе).
2001: DB8 :: 1 и 192.168.0.1 являются удаленными адресами (оба на одном интерфейсе).
Я изменяю удаленный адрес для соединения и получаю следующее:
- подключиться к :: ffff: 127.0.0.1 success (localhost)
- подключение к 2001: DB8 :: 1 успешно (удаленный IPv6-адрес)
- подключиться к :: ffff: 192.168.0.2 success (локальный адрес IPv4)
- ошибка подключения к :: ffff: 192.168.0.1 (22 Недопустимый аргумент - удаленный IPv4)
Если я перехожу к выполнению подключений IPv4, то подключения также работают.
Я думаю, что где-то должна быть проблема с маршрутизацией, но я не могу понять, что мне нужно изменить.
Во-первых, должен ли я теоретически быть в состоянии сделать это?
Есть идеи, что не так?