0

C++ Linux アプリケーションで、FQDN を参照する IP リストを取得するにはどうすればよいですか? (静的 IP + 動的 IP)

10倍

4

2 に答える 2

2

ローカル ドメイン名と完全修飾ドメイン名のマッピングの取得には、基本的な違いはありません。したがって、他のドメイン名と同じようにgetaddrinfoを呼び出すことができます。DNS サーバーは特定のアドレスのみを自由にアドバタイズしたり、より大きなリストからいくつかを選択したりできるため、ドメイン名に関連付けられたすべての IP アドレスのリストを取得する方法はないことに注意してください。たとえば、google.com通常、あなたの大陸のサーバーにマップされます。

使用方法の例を次に示します。

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <arpa/inet.h>
int main(int argc, char** argv) {
 const char* domain = argc>1 ? argv[1] : "example.com";
 struct addrinfo *result, *rp, hints;

 memset(&hints, 0, sizeof(hints));
 hints.ai_socktype = SOCK_STREAM; // TCP

 int tmp = getaddrinfo(domain, NULL, &hints, &result);
 if (tmp != 0) {
  fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(tmp));
  return 1;
 }

 for (rp = result;rp != NULL;rp = rp->ai_next) {
  char buf[INET6_ADDRSTRLEN];
  switch (rp->ai_family) {
  case AF_INET:{
   struct in_addr* a4 = & ((struct sockaddr_in*) rp->ai_addr)->sin_addr;
   inet_ntop(rp->ai_family, a4, buf, sizeof(buf));
   printf("IPv4: %s\n", buf);
   break;}
  case AF_INET6:{
   struct in6_addr* a6 = & ((struct sockaddr_in6*) rp->ai_addr)->sin6_addr;
   inet_ntop(rp->ai_family, a6, buf, sizeof(buf));
   printf("IPv6: %s\n", buf);
   break;
  }}
 }

 freeaddrinfo(result);
 return 0;
}

これは出力されます:

IPv6: 2620:0:2d0:200::10
IPv4: 192.0.32.10
于 2011-01-23T13:38:08.010 に答える
0

C++ ソケット ライブラリで getHostByName() 関数を使用する必要があります。(ここに例があります

IP などの情報を取得できる hostent 構造体が返されます。

于 2011-01-23T13:39:00.230 に答える