如果在接口上手动删除了IPv6链路本地地址,是否有办法在不关闭接口的情况下获取链路本地地址?该要求源于需要在接口上保留(IPv4)现有连接,但也需要在其上获取链路本地地址.
我试图弄清楚如何使用IPV6进行相当于IPV4的广播.
我正在创建一个非阻塞的IPV6 UDP套接字.
从侧面广播我实际上只是在端口12346上执行sendto"FF02 :: 1".
在听力方面,我发现我需要加入小组,所以我做了以下事情:
ipv6_mreq membership;
memset( &membership.ipv6mr_multiaddr, 0, sizeof( in6_addr ) );
membership.ipv6mr_multiaddr.u.Word[0] = htons( 0xff02 );
membership.ipv6mr_multiaddr.u.Word[7] = htons( 0x0001 );
membership.ipv6mr_interface = 0;
if( enable )
{
if ( 0 != setsockopt( m_Socket, SOL_SOCKET, IPV6_JOIN_GROUP, (char*)&membership, sizeof( ipv6_mreq ) ) )
{
DisplayError();
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
但是setsockopt总是返回"WSAENOPROTOOPT".为什么?任何人都可以帮我这个吗?我完全失去了.
编辑:我将级别更改为"IPPROTO_IPV6"但现在我得到了"WSAEINVAL".
大约一周前,有人在StackOverflow上询问为什么他们用于连接到IPv6链接本地地址的Python代码无效,我回答说,因为它是一个链接本地地址,所以需要添加%en0(或者其他任何所需的local-interface-name是其目标IP地址的后缀.我以为我知道我在说什么,所以在回答之前我没有真正测试过我的建议(对我感到羞耻!).
今天我为自己使用了同样的技术,却发现它似乎不起作用.:^(也就是说,此代码不起作用:
>>> from socket import *
>>> s = socket(AF_INET6, SOCK_STREAM)
>>> s.connect(('fe80::21f:5bff:fe3f:1b36%en0', 2001))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in connect
socket.error: [Errno 65] No route to host
Run Code Online (Sandbox Code Playgroud)
另一方面,以下代码可以工作(带或不带%en0后缀):
>>> from socket import *
>>> s = socket(AF_INET6, SOCK_STREAM)
>>> s.connect(('fe80::21f:5bff:fe3f:1b36%en0', 2001, 0, 6))
>>>
Run Code Online (Sandbox Code Playgroud)
...但我不喜欢这样做,因为为了弄清楚要为最后一个参数提供哪个范围ID整数,我必须执行一堆不可移植的代码来迭代本地接口list,找到名为'en0'的接口,并提取其范围ID,这比我想要的更复杂.
鉴于connect()正在接受IP地址的%en0后缀,为什么不按预期使用它来确定范围ID?
FWIW,我正在使用MacOS/X 10.6.4下的Python 2.6.1进行测试.
以下是托管 Web 服务器的机器的 ipconfig 输出:
以太网适配器本地连接:
特定于连接的 DNS 后缀。:链路本地 IPv6 地址。. . . . : fe80::f85b:4256:ee76:24a4%11 IPv4 地址。. . . . . . . . . . :10.213.254.119 子网掩码。. . . . . . . . . . :255.255.255.0 默认网关。. . . . . . . . : 10.213.254.252
我可以使用以下语句访问该网站:“ http://10.213.254.119/test ” 现在我很想知道如何使用链接本地 IPv6 地址访问同一页面?
我的设备和我尝试访问的主机都位于同一子网中.
场景:
我在同一子网中有一台交换机和一台服务器.我必须从我服务器中的浏览器使用ipv6链接本地地址访问交换机.任何人都可以告诉我确切的语法?
操作系统是Ubuntu.我正在为基本的IPv6操作做一个简单的测试.PC通过集线器与IP摄像机(支持IPv6)连接.ping6测试成功.
$ ping6 -I eth1 fe80::240:8cff:fe94:451e
PING fe80::240:8cff:fe94:451e(fe80::240:8cff:fe94:451e) from fe80::224:8cff:fe90:ad3b eth1: 56 data bytes
64 bytes from fe80::240:8cff:fe94:451e: icmp_seq=1 ttl=64 time=3.86 ms
64 bytes from fe80::240:8cff:fe94:451e: icmp_seq=2 ttl=64 time=0.471 ms
Run Code Online (Sandbox Code Playgroud)
代码如下:
#include <linux/in6.h>
#include <sys/socket.h>
#include <stdio.h>
#include <errno.h>
void main()
{
int s, ret, err;
struct sockaddr_in6 addr;
s = socket(AF_INET6, SOCK_STREAM, 0);
addr.sin6_family = AF_INET6;
addr.sin6_port = htons(554);
addr.sin6_flowinfo = 0;
addr.sin6_scope_id = 0;
addr.sin6_addr.s6_addr[0] = 0xfe;
addr.sin6_addr.s6_addr[1] = 0x80;
addr.sin6_addr.s6_addr[2] = 0x00;
addr.sin6_addr.s6_addr[3] = 0x00;
addr.sin6_addr.s6_addr[4] = …Run Code Online (Sandbox Code Playgroud) 我无法理解为什么这个命令不起作用:
openssl s_client -connect [fe80::xxxx:xxxx:xxxx:xxxx]:yyyy
Run Code Online (Sandbox Code Playgroud)
注意:我已经用 's 混淆了上面的链接本地地址x,但我有一些有效的链接本地 ipv6 地址。
yyyy是端口号。
我收到错误:
1995535248:error:02002016:system library:connect:Invalid argument:../crypto/bio/b_sock2.c:108:
1995535248:error:2008A067:BIO routines:BIO_connect:connect error:../crypto/bio/b_sock2.c:109:
connect:errno=22
Run Code Online (Sandbox Code Playgroud)
我也尝试过添加单引号/双引号,但导致了同样的错误:
openssl s_client -connect '[fe80::xxxx:xxxx:xxxx:xxxx]:yyyy'
Run Code Online (Sandbox Code Playgroud)
我使用的是 OpenSSL 1.1.0f 版本,它应该支持 IPv6。
使用 IPv4 地址,它可以工作。
ipv6 ×7
link-local ×7
linux ×2
c ×1
c++ ×1
linux-kernel ×1
multicast ×1
networking ×1
openssl ×1
python ×1
scope-id ×1
server ×1
subnet ×1
tcp ×1
webserver ×1