簡體   English   中英

確定ipv4或ipv6數據結構

[英]Determine if ipv4 or ipv6 data structure

在內核模塊中,給定一個將sa_family初始化為AF_UNSPECstruct sockaddr ,如何可靠地確定它是struct sockaddr_in還是struct sockaddr_in6 在Linux 3.16.0-4-686-pae(x86)上。

    struct sockaddr {
                        unsigned short     sa_family; // AF_UNSPEC
                        char               sa_data[14]; // ?
                        };
    struct sockaddr_in {
                        unsigned short     sin_family;
                        unsigned short     sin_port;
                        struct in_addr     sin_addr;
                        char               sin_zero[8];
                        };
    struct sockaddr_in6 {
                        unsigned short     sin6_family;
                        unsigned short     sin6_port;
                        unsigned int       sin6_flowinfo;
                        struct in6_addr    sin6_addr;
                        unsigned int       sin6_scope_id;
                        };

通常,當某些東西調用內核並給出struct sockaddr ,它還必須給出struct sockaddr的長度。 例如,參見sendto()

ssize_t sendto (int sockfd, const void *buf, size_t buflen, int flags,
                    const struct sockaddr *addr, socklen_t addrlen);

使用緩沖區的大小,您應該能夠對需要使用哪種類型的sockaddr做出很好的猜測:

if (addr.sa_family == AF_UNSPEC) {
    switch (addrlen) {
        case sizeof (struct sockaddr_in): {
            addr.sa_family = AF_INET;
            break;
        }

        case sizeof (struct sockaddr_in6): {
            addr.sa_family = AF_INET6;
            break;
        }

        default: {
            // handle error

            break;
        }
    }
}

在理想情況下, sa_family應該已經設置為AF_INET (IPv4)或AF_INET6 (IPv6),但是不幸的是,這里似乎不是這樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM