Tôi duy trì GPSD, một daemon dịch vụ mã nguồn mở được triển khai rộng rãi theo dõi GPS và các cảm biến trắc địa khác. Nó lắng nghe các kết nối ứng dụng khách trên cổng 2947 trên cả IPv4 và IPv6. Đối với bảo mật và quyền riêng tư, nó thường chỉ nghe trên địa chỉ loopback, nhưng có một tùy chọn -G cho daemon được thiết kế để làm cho nó lắng nghe trên bất kỳ địa chỉ nào.Cách nghe trên tất cả các địa chỉ IPV6 bằng cách sử dụng ổ cắm C API
Vấn đề: tùy chọn -G hoạt động trong IPv4, nhưng tôi không thể tìm ra cách làm cho nó hoạt động với IPv6. Phương pháp nên hoạt động dựa trên các ví dụ hướng dẫn khác nhau, không sản xuất thay vì một lỗi cho biết địa chỉ đã được sử dụng. Tôi đang tìm kiếm sự trợ giúp để khắc phục sự cố này từ những người có kinh nghiệm về lập trình mạng IPv6.
mã có liên quan là tại http://git.berlios.de/cgi-bin/gitweb.cgi?p=gpsd;a=blob;f=gpsd.c;h=ee2156caf03ca23405f57f3e04e9ef306a75686f;hb=HEAD
Mã này hoạt động một cách chính xác trong trường hợp cả hai -G và phi -G dưới IPv4, như có thể dễ dàng xác minh với -l netstat.
Bây giờ hãy xem xung quanh dòng 398 sau "trường hợp AF_INET6:". Tùy chọn listen_global được đặt bởi -G; khi sai, mã thành công. hiện nay có một lời nhận xét sau đây, được thừa hưởng từ một người đóng góp không rõ, mà đọc như thế này:
/* 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
*/
Theo ví dụ hướng dẫn khác nhau tôi đã nhìn lên, sự phân công "sat.sa_in6.sin6_addr = in6addr_any;" là (mặc dù bình luận) chính xác, và nó biên dịch. Tuy nhiên, khởi động với -G không xác nhận địa chỉ nghe đã được sử dụng.
Bài tập là "sat.sa_in6.sin6_addr = in6addr_any;" chính xác ở đây? Còn gì nữa, nếu có, tôi có bị mất tích không?
Bạn đã thử truy tìm daemon chưa? – jpalecek