簡體   English   中英

是否有一個函數可以檢查名為 sptr 的 sockaddr* 是否指向 ipv4 或 ipv6 地址?

[英]Is there a function that checks whether a sockaddr* named sptr points to an ipv4 or ipv6 address?

是否有一個函數可以檢查名為sptrsockaddr *是否指向 ipv4 或 ipv6 地址? 例如我有下面的代碼,我如何添加它來獲取地址是 ipv4 還是 ipv6,我可以使用getaddrinfo()嗎?

struct sockaddr *sptr;
struct sockaddr_in *ipv4_ptr;

您可以測試sa_family成員:

switch (sptr->sa_family)
{
    case AF_INET:
    /* IPv4 */
    break;

    case AF_INET6:
    /* IPv6 */
    break;

    default:
    /* Something else */
}

如果sa_family成員是AF_INET ,則表示 IPv4 地址,而套接字地址實際上是struct sockaddr_in * 如果sa_family成員是AF_INET6 ,則表示 IPv6 地址,而套接字地址實際上是struct sockaddr_in6

AF_INETAF_INET6地址族的結構不同,因此必須為它們使用不同的指針類型。 繼續的方法是使用:

struct sockaddr *genptr;
... /* initialize genptr to point to the sockaddr structure */
switch (genptr->sa_family) {
case AF_INET: {
    struct sockaddr_in *ipv4ptr = (struct sockaddr_in *)genptr;
    /* check IPV4 addresses using ipv4ptr pointer */
    } break;
case AF_INET6: {
    struct sockaddr_in6 *ipv6ptr = (struct sockaddr_in6 *)genptr;
    /* check IPV6 addresses using ipv6ptr pointer */
    } break;
default: /* NEITHER IPV4 NOR IPV6, IPX? NETBIOS? X25? */
} /* switch */

雖然效率較低,但您可以使用與版本無關的inet_ntop(3)例程轉換您的地址,並使用某種正則表達式匹配算法來部分匹配地址。 inet_ntop例程獲取通用指針並inet_ntop構建網絡地址的 ipv4/ipv6 ascii 字符串。

暫無
暫無

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

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