我維護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