加入收藏 | 设为首页 | 会员中心 | 我要投稿 好传媒网 (https://www.haochuanmei.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 移动互联 > 评测 > 正文

一份完整的 IPv6 环境下 DNS 相关测试

发布时间:2019-07-23 14:26:26 所属栏目:评测 来源:董涛 张欣接
导读:董涛,网易游戏高级运维工程师,主要工作方向为网易集团 DNS 的运维与开发。 张欣接,网易集团 DNS 团队负责人,负责网易域名系统的架构设计及生态建设。 一、IPv6 支持度报告 IPv6 简介 IPv6(Internet Protocol version 6,互联网通信协议第 6 版)是用

  1. #define WIN32_LEAN_AND_MEAN 
  2.     #define _WIN32_WINNT 0x501 
  3.     #include <windows.h> 
  4.     #include <winsock2.h> 
  5.     #include <stdio.h> 
  6.     #include <string.h> 
  7.     #include <stdlib.h> 
  8.     #include <sys/types.h> 
  9.     #include <ws2tcpip.h> 
  10.  
  11.     #pragma comment (lib, "Ws2_32.lib") 
  12.  
  13.     // int iResult; 
  14.     WSADATA wsaData; 
  15.     int iResult = WSAStartup(MAKEWORD(2,2), &wsaData); 
  16.  
  17.     int inet_pton(int af, const char *src, void *dst) 
  18.         struct sockaddr_storage ss; 
  19.         int size = sizeof(ss); 
  20.         char src_copy[INET6_ADDRSTRLEN+1]; 
  21.  
  22.         ZeroMemory(&ss, sizeof(ss)); 
  23.         /* stupid non-const API */ 
  24.         strncpy (src_copy, src, INET6_ADDRSTRLEN+1) 
  25.         src_copy[INET6_ADDRSTRLEN] = 0; 
  26.  
  27.         if (WSAStringToAddress(src_copy, af, NULL, (struct sockaddr *)&ss, &size) == 0) { 
  28.             switch(af) { 
  29.                 case AF_INET: 
  30.                     *(struct in_addr *)dst = ((struct sockaddr_in *)&ss)->sin_addr; 
  31.                     return 1; 
  32.                 case AF_INET6: 
  33.                     *(struct in6_addr *)dst = ((struct sockaddr_in6 *)&ss)->sin6_addr; 
  34.                     return 1; 
  35.             } 
  36.         } 
  37.         return 0; 
  38.     } 
  39.     const char *inet_ntop(int af, const void *src, char *dst, socklen_t size) 
  40.         struct sockaddr_storage ss; 
  41.         unsigned long s = size; 
  42.         ZeroMemory(&ss, sizeof(ss)); 
  43.         ss.ss_family = af; 
  44.         switch(af) { 
  45.             case AF_INET: 
  46.                 ((struct sockaddr_in *)&ss)->sin_addr = *(struct in_addr *)src; 
  47.                 break; 
  48.             case AF_INET6: 
  49.                 ((struct sockaddr_in6 *)&ss)->sin6_addr = *(struct in6_addr *)src; 
  50.                 break; 
  51.             default: 
  52.                 return NULL; 
  53.         } 
  54.         /* cannot direclty use &size because of strict aliasing rules */ 
  55.         return (WSAAddressToString((struct sockaddr *)&ss, sizeof(ss), NULL, dst, &s) == 0)? 
  56.                dst : NULL; 
  57.     } 
  58.     int lookup_host () 
  59.         struct addrinfo hints, *res; 
  60.         int errcode; 
  61.         char addrstr[100]; 
  62.         void *ptr; 
  63.         memset (&hints, 0, sizeof (hints)); 
  64.         hints.ai_family = AF_INET6; 
  65.         errcode = getaddrinfo ("IPv6test.ntes53.netease.com", NULL, &hints, &res); 
  66.         if (errcode != 0) 
  67.         { 
  68.             perror ("getaddrinfo"); 
  69.             printf("%d",errcode); 
  70.             return -1; 
  71.         } 
  72.         while (res) 
  73.         { 
  74.             // inet_ntop (res->ai_family, res->ai_addr->sa_data, addrstr, 100); 
  75.             sockaddr_in in1; 
  76.             memcpy(&in1.sin_addr, res->ai_addr->sa_data, sizeof(res)); 
  77.             switch (res->ai_family) 
  78.             { 
  79.                 case AF_INET: 
  80.                     ptr = &((struct sockaddr_in *) res->ai_addr)->sin_addr; 
  81.                     break; 
  82.                 case AF_INET6: 
  83.                     ptr = &((struct sockaddr_in6 *) res->ai_addr)->sin6_addr; 
  84.                     break; 
  85.             } 
  86.             inet_ntop(res->ai_family, ptr, addrstr, 100); 
  87.             // sockaddr_in6 in; 
  88.             // memcpy(&in.sin6_addr, ptr, sizeof(ptr)); 
  89.             printf ("IPv%d address: %s (%s)n", res->ai_family == PF_INET6 ? 6 : 4, 
  90.                    addrstr, res->ai_canonname); 
  91.             //printf ("IPv%d address: %s (%s)n", res->ai_family == PF_INET6 ? 6 : 4, 
  92.             //        inet_ntoa(in.sin6_addr), res->ai_canonname); 
  93.             res = res->ai_next; 
  94.         } 
  95.         return 0; 
  96.     } 
  97.     int main (void) 
  98.         printf("startn"); 
  99.         lookup_host(); 
  100.     } 

Python

  • socket.gethostbyname

  1. import socket 
  2. result = socket.gethostbyname("IPv6test.ntes53.netease.com") 
  3. print result 
  • getaddrinfo
  1. import socket 
  2. result = socket.getaddrinfo("IPv6test.ntes53.netease.com", 0, socket.AF_INET6) 
  3. print result 
  4. result = socket.getaddrinfo("IPv6test.ntes53.netease.com", 0, socket.AF_INET) 
  5. print result 
  6. result = socket.getaddrinfo("IPv6test.ntes53.netease.com", 0, socket.AF_UNSPEC) 
  7. print result 

当不指定 socktype 时,此值默认为 socket.AF_UNSPEC

HTTP 请求

Python

requests 包

(编辑:好传媒网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读