Ошибка привязки IPV6: невозможно назначить запрошенный адрес
Я настроил систему Ubuntu Linux со следующими интерфейсами и назначенными адресами IPV6 следующим образом:
**Eth0:** Link encap:Ethernet HWaddr 00:50:56:8d:57:64
inet addr:192.168.254.10 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::250:56ff:fe8d:5764/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:74231424 errors:0 dropped:1 overruns:0 frame:0
TX packets:400372550 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000
RX bytes:24514286488 (24.5 GB) TX bytes:115992171490 (115.9 GB)
**Eth1:** Link encap:Ethernet HWaddr 00:50:56:8d:7c:4c
inet addr:192.168.1.10 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::250:56ff:fe8d:7c4c/64 Scope:Link
inet6 addr: fc00:1234:1::10/120 Scope:Global
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:434933479 errors:0 dropped:1 overruns:0 frame:0
TX packets:39666183 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000
RX bytes:126065364448 (126.0 GB) TX bytes:14437801257 (14.4 GB)
**Eth2:** Link encap:Ethernet HWaddr 00:50:56:8d:56:14
inet addr:192.168.2.10 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fc00:1234:2::10/120 Scope:Global
inet6 addr: fe80::250:56ff:fe8d:5614/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:480068741 errors:0 dropped:0 overruns:0 frame:0
TX packets:34145702 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000
RX bytes:146795537550 (146.7 GB) TX bytes:10045338657 (10.0 GB)
2. Я хотел заниматься программированием сокетов с использованием сокетов IPV6. Фрагмент кода, который я написал, выглядит следующим образом:
struct sockaddr_in6 sin
Ipv6_fdr = socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP)
bzero(&sin, sizeof(sin));
sin.sin6_family = AF_INET6;
sin.sin6_port = htons(2152);
if ((setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int))) < 0)
memcpy(&(sin.sin6_addr), "fc00:1234:1::10",sizeof(sin.sin6_addr));
if ((bind(sock, (struct sockaddr*)&sin, sizeof(sin)))< 0)
3. После успешной компиляции я получаю сообщение об ошибке привязки IPV6 со следующим номером ошибки и именем:
EADDRNOTAVAIL 99 /* Cannot assign requested address.
После определенного количества попыток связывания IPV6 выдает ошибку ошибки сегментации.
Было бы здорово, если бы кто-то мог помочь мне в том, какую ошибку я здесь делаю и почему сбой привязки IPV6?
1 ответ
Линия
memcpy(&(sin.sin6_addr), "fc00:1234:1::10",sizeof(sin.sin6_addr));
неправильно; это абсолютно не так, как вы устанавливаете адрес и порт сокета. Посмотри пожалуйста man 7 ipv6
и вопрос " Как установить порядок байтов sockaddr_in6::sin6_addr для сетевого порядка байтов" в StackOverflow. Для вашего случая использования вы, вероятно, хотите использовать inet_pton
преобразовать адрес из текста в двоичную форму.