How to find the scope_id for an IPv6 socket
我在代码中使用了IPv6 UDP套接字连接。执行失败,因为该设备不存在。
1 |
回复
1 | No such device |
我使用链接本地地址。
服务器
1 | fe80::213:afff:fe94:d75 |
客户端
1 | fe80::f2d5:bfff:fe10:f1b1 |
我通过ifconfig得到了scope_id:
1 2 3 4 5 6 7 | bt0: flags=4177<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1280 inet6 fe80::f2d5:bfff:fe10:f1b1 prefixlen 64 scopeid 0x20<link> unspec F0-D5-BF-FF-FE-10-F1-B1-00-00-00-00-00-00-00-00 txqueuelen 1000 (UNSPEC) RX packets 3 bytes 84 (84.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 11 bytes 370 (370.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 |
由于另一个接口具有相同的scope_id,我想scope_id在这里表示IPv6范围。 0x20 = link_local。
1 2 3 4 5 6 7 8 9 10 11 | enp0s31f6: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.0.4 netmask 255.255.255.0 broadcast 192.168.0.255 inet6 fe80::fb58:43b9:10fa:101 prefixlen 64 scopeid 0x20<link> inet6 2a02:8109:b6bf:ca24:ae7f:b967:932e:b2f4 prefixlen 64 scopeid 0x0<global> inet6 2a02:8109:b6bf:ca24:51f:6c37:66c4:5282 prefixlen 64 scopeid 0x0<global> ether c8:5b:76:98:55:bf txqueuelen 1000 (Ethernet) RX packets 16413820 bytes 20299047086 (20.2 GB) RX errors 18 dropped 0 overruns 0 frame 16 TX packets 6110718 bytes 714537636 (714.5 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 device interrupt 16 memory 0xf1200000-f1220000 |
因此,我在代码中使用了这个scope_id:
1 2 3 4 5 6 7 8 9 10 | #define CLIENT_ADDRESS { 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0xd5, 0xbf, 0xff, 0xfe, 0x10, 0xf1, 0xb1 }; struct sockaddr_in6 client_addr; unsigned int client_addr_len = sizeof(client_addr); memset(&client_addr, 0, client_addr_len); client_addr.sin6_family = AF_INET6; client_addr.sin6_port = htons(PORT); client_addr.sin6_scope_id = 0x20; uint8_t address[16] = CLIENT_ADDRESS; memcpy(&client_addr.sin6_addr, address, 16); |
这不是正确的界面。
所以我的问题是:在哪里可以找到我的界面的正确scope_id?
是否有一些Linux工具可以获取它?
也许正在寻找
1 | client_addr.sin6_scope_id = if_nametoindex("tun0"); |
手册页中
好的,我明白了。 sockaddr_in6中的scope_id是接口ID。您可以使用
找到接口ID。
1 | ip link show |