【发布时间】:2015-11-08 01:08:07
【问题描述】:
试图让守护进程绑定到fe80::%en0。
我不能 100% 确定这是可能的,但看起来链接本地地址应该很有用。
如果您想从链路另一端的对等方接收数据包,那么必须指定完整的链路本地地址似乎很愚蠢。
代码如下:
if (DEBUG_ENABLED4) {
if (salocal.ss_family == AF_INET) {
char buffer[INET_ADDRSTRLEN];
struct sockaddr_in *addr = (struct sockaddr_in *)&salocal;
inet_ntop(addr->sin_family, &addr->sin_addr, buffer, sizeof(buffer));
DEBUG4("[FD %i] Binding to address %s port %u -- bind(%i, %p, %u)",
this->fd, buffer, ntohs(addr->sin_port), this->fd, &salocal, salen);
} else if (salocal.ss_family == AF_INET6) {
char buffer[INET6_ADDRSTRLEN];
struct sockaddr_in6 *addr = (struct sockaddr_in6 *)&salocal;
inet_ntop(addr->sin6_family, &addr->sin6_addr, buffer, sizeof(buffer));
DEBUG4("[FD %i] Binding to address %s port %u scope ID %i -- bind(%i, %p, %u)",
this->fd, buffer, ntohs(addr->sin6_port), addr->sin6_scope_id,
this->fd, &salocal, salen);
}
}
rad_suid_up();
rcode = bind(this->fd, (struct sockaddr *)&salocal, salen);
rad_suid_down();
调试输出如下所示:
Sat Nov 7 19:58:28 2015 : Debug: [FD 12] Binding to address fe80:: port 1812 scope ID 4 -- bind(12, 0x7fff599dc4d0, 28)
Sat Nov 7 19:58:28 2015 : Error: Failed binding to auth address fe80:: port 1812 bound to server default: EADDRNOTAVAIL: Can't assign requested address
Sat Nov 7 19:58:28 2015 : Error: /usr/local/freeradius/etc/raddb/sites-enabled/default[215]: Error binding to port for fe80:: port 1812
Ifconfig 输出如下所示:
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=10b<RXCSUM,TXCSUM,VLAN_HWTAGGING,AV>
ether a8:20:66:xx:xx:xx
inet6 fe80::aa20:66ff:fe1a:8bcd%en0 prefixlen 64 scopeid 0x4
值似乎都匹配,但 bind 返回 EADDRNOTAVAIL。我需要启用一些魔术套接字选项才能使其工作吗?还是我需要专门检查该链接本地 IP 前缀,然后将其解析为 scope_id/zone_id 描述的接口的完整地址?
【问题讨论】:
-
不能只绑定未指定的地址吗?
-
与
::一样,当然,但它不等价。 -
请解释为什么它在您的上下文中有所不同。通常情况下,你要绑定到未指定的地址进行监听。
-
嗯,不,您将绑定到未指定的地址以在每个接口上绑定该特定端口。我只想从链路本地对等方接收数据报。绑定到 in6addr_any 意味着我也会在与其他范围的接口上接收数据报。
-
您通常绑定到子网地址而不是主机上配置的地址吗?