我维护GPSD,这是一种广泛部署的开源服务守护程序,可监视GPS和其他大地测量传感器。它在IPv4和IPv6上侦听端口2947上的客户端应用程序连接。为了安全和隐私,它通常只监听环回地址,但守护进程有一个-G选项,用于监听任何地址。如何使用C套接字监听所有IPV6地址API
问题:-G选项适用于IPv4,但我无法弄清楚如何使它适用于IPv6。基于各种教程实例应该工作的方法不是,反而产生一个提示地址已被使用的错误。我正在寻求帮助来解决这个问题,从那些经验丰富的IPv6网络编程人员。
这段代码在IPv4的下两个-G和非-G情况下正常工作,因为很容易用netstat -l验证。
现在在“case AF_INET6:”之后查看第398行。 listen_global选项由-G设置;当错误时,代码成功。这里目前是下面的注释,从一个默默无闻的贡献者继承,上面写着这样的:
/* 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;”名义上在这里正确吗?还有什么,如果有的话,我是否错过了?
您是否尝试过守护进程? – jpalecek