簡體   English   中英

使用標准C套接字API判斷文本字符串是IPv6地址還是IPv4地址

[英]Tell whether a text string is an IPv6 address or IPv4 address using standard C sockets API

我有一個程序,其中一個外部組件傳遞給我一個包含IP地址的字符串。 然后我需要把它變成一個URI。 對於IPv4來說這很容易; 我在前面加上http://並追加/。 但是,對於IPv6,我還需要用括號[]括起來。

是否有標准的套接字API調用來確定地址的地址族?

的種類。 您可以使用inet_pton()嘗試首先將字符串解析為IPv4( AF_INET )然后解析IPv6( AF_INET6 )。 返回代碼將告訴您函數是否成功,因此字符串包含嘗試類型的地址。

例如:

#include <arpa/inet.h>
#include <stdio.h>

static int
ip_version(const char *src) {
    char buf[16];
    if (inet_pton(AF_INET, src, buf)) {
        return 4;
    } else if (inet_pton(AF_INET6, src, buf)) {
        return 6;
    }
    return -1;
}

int
main(int argc, char *argv[]) {
    for (int i = 1; i < argc; ++i) {
        printf("%s\t%d\n", argv[i], ip_version(argv[i]));
    }

    return 0;
}

使用getaddrinfo ()並將提示標志AI_NUMERICHOST,family設置為AF_UNSPEC,從getaddrinfo成功返回后,生成的struct addrinfo .ai_family成員將是AF_INET或AF_INET6。

編輯,小例子

#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netdb.h>

int main(int argc, char *argv[])
{
    struct addrinfo hint, *res = NULL;
    int ret;

    memset(&hint, '\0', sizeof hint);

    hint.ai_family = PF_UNSPEC;
    hint.ai_flags = AI_NUMERICHOST;

    ret = getaddrinfo(argv[1], NULL, &hint, &res);
    if (ret) {
        puts("Invalid address");
        puts(gai_strerror(ret));
        return 1;
    }
    if(res->ai_family == AF_INET) {
        printf("%s is an ipv4 address\n",argv[1]);
    } else if (res->ai_family == AF_INET6) {
        printf("%s is an ipv6 address\n",argv[1]);
    } else {
        printf("%s is an is unknown address format %d\n",argv[1],res->ai_family);
    }

   freeaddrinfo(res);
   return 0;
}

$ ./a.out 127.0.0.1
127.0.0.1 is an ipv4 address
$ ./a.out ff01::01
ff01::01 is an ipv6 address

暫無
暫無

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

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