【发布时间】:2011-09-19 15:38:11
【问题描述】:
我维护 GPSD,这是一个广泛部署的开源服务守护程序,用于监控 GPS 和其他大地测量传感器。它在 IPv4 和 IPv6 的端口 2947 上侦听客户端应用程序连接。为了安全和隐私,它通常只侦听环回地址,但守护进程有一个 -G 选项,旨在使其侦听任何地址。
问题:-G 选项适用于 IPv4,但我不知道如何使其适用于 IPv6。基于各种教程示例应该工作的方法没有,而是产生一个错误,表明该地址已在使用中。我正在向有 IPv6 网络编程经验的人寻求帮助来解决这个问题。
此代码在 IPv4 下的 -G 和非 -G 情况下都能正常运行,这很容易用 netstat -l 验证。
现在查看“case AF_INET6:”之后的第 398 行。 listen_global 选项由 -G 设置;当为 false 时,代码成功。目前有以下评论,继承自未知贡献者,内容如下:
/* else */
/* BAD: sat.sa_in6.sin6_addr = in6addr_any;
* the simple assignment will not work (except as an initializer)
* because sin6_addr is an array not a simple type
* we could do something like this:
* memcpy(sat.sa_in6.sin6_addr, in6addr_any, sizeof(sin6_addr));
* BUT, all zeros is IPv6 wildcard, and we just zeroed the array
* so really nothing to do here
*/
根据我查阅的各种教程示例,赋值“sat.sa_in6.sin6_addr = in6addr_any;”是(尽管有评论)是正确的,它确实可以编译。但是,使用 -G 启动失败,声称监听地址已在使用中。
是赋值“sat.sa_in6.sin6_addr = in6addr_any;”名义上正确吗?我还缺少什么(如果有的话)?
【问题讨论】:
-
你试过跟踪守护进程吗?