[C Language] The function getaddrinfo() that supports IPv6 address query
はじめに:C 言語によるハードウェア開発では、IPv6 アドレスクエリに対応する getaddrinfo() 関数を gethostbyname() の代わりに使用します。
アドレスクエリ関数の役割は、ホスト名またはドメイン名を基にホストの詳細情報を取得することです。中でも最もよく使われるのは、ホスト名から IP アドレスなどのホスト情報を取得する機能です。
Alibaba Cloud IoT Platform のハードウェアにアクセスするには、まず IoT アクセスエンドポイントを名前解決する必要があります。プロダクトごとにアクセスドメイン名が異なり、規則は以下の通りです:
${productKey}.iot-as-mqtt.${regionId}.aliyuncs.com
getaddrinfo() 関数
IPv6 で導入された getaddrinfo() の新しい API はプロトコル非依存であり、IPv4 と IPv6 の両方で使用できます。getaddrinfo() 関数は、名前解決とサービス名からポート番号への変換の両方を処理し、アドレスリストではなく addrinfo 構造体(リスト)へのポインターを返します。
古い IPv4 専用の gethostbyname() を getaddrinfo() 関数に置き換えることが強く推奨されます。
関数プロトタイプ:
ホスト名またはサービス名から IP アドレスを取得する
ヘッダファイル:
int getaddrinfo(const char *restrict host,
const char *restrict service,
const struct addrinfo *restrict hints,
struct addrinfo **restrict result);
パラメーターの説明:
host:ホスト名またはアドレス文字列(IPv4 の場合はドット区切り 10 進数文字列、IPv6 の場合は 16 進数文字列)
service:サービス名。10 進数のポート番号、または ftp や http などの定義済みサービス名を指定できます
hints:ヌルポインター、または呼び出し元が返される情報のタイプに関するヒントを設定した addrinfo 構造体を指すポインターを指定できます。たとえば、指定するサービスが TCP と UDP の両方をサポートしている場合、呼び出し元は hints 構造体の ai_socktype メンバーを SOCK_DGRAM に設定することで、データグラムソケットに適用される情報のみが返されるようにできます
result:result ポインターパラメーターを通じて、addrinfo 構造体の連結リストへのポインターを返します
戻り値:
成功した場合は 0 を返し、エラーの場合は 0 以外のエラーコードを返します
addrinfo 構造体:
struct addrinfo {
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
socklen_t ai_addrlen; //ai_addr のアドレス長
struct sockaddr *ai_addr;
char *ai_canonname;
struct addrinfo *ai_next; //連結リストの次のノードへのポインター
};
使用例:
struct addrinfo *ai, *aip;
struct addrinfo hint;
struct sockaddr_in *sinp;
const char *addr;
int err;
char buf[1024];
hint.ai_flags = AI_CANONNAME;
hint.ai_family = 0;
hint.ai_socktype = 0;
hint.ai_protocol = 0;
hint.ai_addrlen = 0;
hint.ai_canonname = NULL;
hint.ai_addr = NULL;
hint.ai_next = NULL;
if((err = getaddrinfo("aliyun.com", NULL, &hint, &ai)) 。= 0)
printf("ERROR: getaddrinfo error: %s ", gai_strerror(err));
for(aip = ai; aip 。= NULL; aip = aip->ai_next)
{
print_family(aip);
print_type(aip);
print_protocol(aip);
print_flags(aip);
printf(" ");
printf("Canonical Name: %s ", aip->ai_canonname);
if(aip->ai_family == AF_INET)
{
sinp = (struct sockaddr_in *)aip->ai_addr;
addr = inet_ntop(AF_INET, &sinp->sin_addr, buf, sizeof buf);
printf("IP Address: %s ", addr);
printf("Port: %d ", ntohs(sinp->sin_port));
}
printf(" ");
アドレスクエリ関数の役割は、ホスト名またはドメイン名を基にホストの詳細情報を取得することです。中でも最もよく使われるのは、ホスト名から IP アドレスなどのホスト情報を取得する機能です。
Alibaba Cloud IoT Platform のハードウェアにアクセスするには、まず IoT アクセスエンドポイントを名前解決する必要があります。プロダクトごとにアクセスドメイン名が異なり、規則は以下の通りです:
${productKey}.iot-as-mqtt.${regionId}.aliyuncs.com
getaddrinfo() 関数
IPv6 で導入された getaddrinfo() の新しい API はプロトコル非依存であり、IPv4 と IPv6 の両方で使用できます。getaddrinfo() 関数は、名前解決とサービス名からポート番号への変換の両方を処理し、アドレスリストではなく addrinfo 構造体(リスト)へのポインターを返します。
古い IPv4 専用の gethostbyname() を getaddrinfo() 関数に置き換えることが強く推奨されます。
関数プロトタイプ:
ホスト名またはサービス名から IP アドレスを取得する
ヘッダファイル:
int getaddrinfo(const char *restrict host,
const char *restrict service,
const struct addrinfo *restrict hints,
struct addrinfo **restrict result);
パラメーターの説明:
host:ホスト名またはアドレス文字列(IPv4 の場合はドット区切り 10 進数文字列、IPv6 の場合は 16 進数文字列)
service:サービス名。10 進数のポート番号、または ftp や http などの定義済みサービス名を指定できます
hints:ヌルポインター、または呼び出し元が返される情報のタイプに関するヒントを設定した addrinfo 構造体を指すポインターを指定できます。たとえば、指定するサービスが TCP と UDP の両方をサポートしている場合、呼び出し元は hints 構造体の ai_socktype メンバーを SOCK_DGRAM に設定することで、データグラムソケットに適用される情報のみが返されるようにできます
result:result ポインターパラメーターを通じて、addrinfo 構造体の連結リストへのポインターを返します
戻り値:
成功した場合は 0 を返し、エラーの場合は 0 以外のエラーコードを返します
addrinfo 構造体:
struct addrinfo {
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
socklen_t ai_addrlen; //ai_addr のアドレス長
struct sockaddr *ai_addr;
char *ai_canonname;
struct addrinfo *ai_next; //連結リストの次のノードへのポインター
};
使用例:
struct addrinfo *ai, *aip;
struct addrinfo hint;
struct sockaddr_in *sinp;
const char *addr;
int err;
char buf[1024];
hint.ai_flags = AI_CANONNAME;
hint.ai_family = 0;
hint.ai_socktype = 0;
hint.ai_protocol = 0;
hint.ai_addrlen = 0;
hint.ai_canonname = NULL;
hint.ai_addr = NULL;
hint.ai_next = NULL;
if((err = getaddrinfo("aliyun.com", NULL, &hint, &ai)) 。= 0)
printf("ERROR: getaddrinfo error: %s ", gai_strerror(err));
for(aip = ai; aip 。= NULL; aip = aip->ai_next)
{
print_family(aip);
print_type(aip);
print_protocol(aip);
print_flags(aip);
printf(" ");
printf("Canonical Name: %s ", aip->ai_canonname);
if(aip->ai_family == AF_INET)
{
sinp = (struct sockaddr_in *)aip->ai_addr;
addr = inet_ntop(AF_INET, &sinp->sin_addr, buf, sizeof buf);
printf("IP Address: %s ", addr);
printf("Port: %d ", ntohs(sinp->sin_port));
}
printf(" ");
Related Articles
-
A detailed explanation of Hadoop core architecture HDFS
Knowledge Base Team
-
What Does IOT Mean
Knowledge Base Team
-
6 Optional Technologies for Data Storage
Knowledge Base Team
-
What Is Blockchain Technology
Knowledge Base Team
Explore More Special Offers
-
Short Message Service(SMS) & Mail Service
50,000 email package starts as low as USD 1.99, 120 short messages start at only USD 1.00
