我维护GPSD,这是一个广泛部署的开源服务守护程序,监视GPS和其他大地测量传感器。它在IPv4和IPv6上的2947端口监听客户端连接。出于安全和隐私考虑,它通常只在回环地址上进行监听,但守护程序中有一个 -G 选项,旨在使其在任何地址上进行监听。
问题是:-G 选项在IPv4下有效,但我无法弄清如何使其在IPv6下工作。基于各种教程示例应该有效的方法不起作用,反而会产生错误提示地址已在使用中。我正在寻求有经验的IPv6网络编程人员的帮助来解决这个问题。
相关代码在http://git.berlios.de/cgi-bin/gitweb.cgi?p=gpsd;a=blob;f=gpsd.c;h=ee2156caf03ca23405f57f3e04e9ef306a75686f;hb=HEAD。
此代码在IPv4下的-G和非-G情况下均可以正确操作,可通过netstat -l轻松验证。
现在看看“case AF_INET6:”后面的398行左右。当 -G 设置为false时,listen_global选项也将被设置;这段代码是有效的。目前有一个来自未知贡献者的以下评论:
问题是:-G 选项在IPv4下有效,但我无法弄清如何使其在IPv6下工作。基于各种教程示例应该有效的方法不起作用,反而会产生错误提示地址已在使用中。我正在寻求有经验的IPv6网络编程人员的帮助来解决这个问题。
相关代码在http://git.berlios.de/cgi-bin/gitweb.cgi?p=gpsd;a=blob;f=gpsd.c;h=ee2156caf03ca23405f57f3e04e9ef306a75686f;hb=HEAD。
此代码在IPv4下的-G和非-G情况下均可以正确操作,可通过netstat -l轻松验证。
现在看看“case AF_INET6:”后面的398行左右。当 -G 设置为false时,listen_global选项也将被设置;这段代码是有效的。目前有一个来自未知贡献者的以下评论:
/* 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;”是否基本上正确?如果还有其他问题,请指出。