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

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

发布时间:2019-07-24 00:31:15 所属栏目:评测 来源:董涛 张欣接
导读:董涛,网易游戏高级运维工程师,主要工作方向为网易集团 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. { 
  19.         struct sockaddr_storage ss; 
  20.         int size = sizeof(ss); 
  21.         char src_copy[INET6_ADDRSTRLEN+1]; 
  22.  
  23.         ZeroMemory(&ss, sizeof(ss)); 
  24.         /* stupid non-const API */ 
  25.         strncpy (src_copy, src, INET6_ADDRSTRLEN+1) 
  26.         src_copy[INET6_ADDRSTRLEN] = 0; 
  27.  
  28.         if (WSAStringToAddress(src_copy, af, NULL, (struct sockaddr *)&ss, &size) == 0) { 
  29.             switch(af) { 
  30.                 case AF_INET: 
  31.                     *(struct in_addr *)dst = ((struct sockaddr_in *)&ss)->sin_addr; 
  32.                     return 1; 
  33.                 case AF_INET6: 
  34.                     *(struct in6_addr *)dst = ((struct sockaddr_in6 *)&ss)->sin6_addr; 
  35.                     return 1; 
  36.             } 
  37.         } 
  38.         return 0; 
  39.     } 
  40.     const char *inet_ntop(int af, const void *src, char *dst, socklen_t size) 
  41. { 
  42.         struct sockaddr_storage ss; 
  43.         unsigned long s = size; 
  44.         ZeroMemory(&ss, sizeof(ss)); 
  45.         ss.ss_family = af; 
  46.         switch(af) { 
  47.             case AF_INET: 
  48.                 ((struct sockaddr_in *)&ss)->sin_addr = *(struct in_addr *)src; 
  49.                 break; 
  50.             case AF_INET6: 
  51.                 ((struct sockaddr_in6 *)&ss)->sin6_addr = *(struct in6_addr *)src; 
  52.                 break; 
  53.             default: 
  54.                 return NULL; 
  55.         } 
  56.         /* cannot direclty use &size because of strict aliasing rules */ 
  57.         return (WSAAddressToString((struct sockaddr *)&ss, sizeof(ss), NULL, dst, &s) == 0)? 
  58.                dst : NULL; 
  59.     } 
  60.     int lookup_host () 
  61. { 
  62.         struct addrinfo hints, *res; 
  63.         int errcode; 
  64.         char addrstr[100]; 
  65.         void *ptr; 
  66.         memset (&hints, 0, sizeof (hints)); 
  67.         hints.ai_family = AF_INET6; 
  68.         errcode = getaddrinfo ("IPv6test.ntes53.netease.com", NULL, &hints, &res); 
  69.         if (errcode != 0) 
  70.         { 
  71.             perror ("getaddrinfo"); 
  72.             printf("%d",errcode); 
  73.             return -1; 
  74.         } 
  75.         while (res) 
  76.         { 
  77.             // inet_ntop (res->ai_family, res->ai_addr->sa_data, addrstr, 100); 
  78.             sockaddr_in in1; 
  79.             memcpy(&in1.sin_addr, res->ai_addr->sa_data, sizeof(res)); 
  80.             switch (res->ai_family) 
  81.             { 
  82.                 case AF_INET: 
  83.                     ptr = &((struct sockaddr_in *) res->ai_addr)->sin_addr; 
  84.                     break; 
  85.                 case AF_INET6: 
  86.                     ptr = &((struct sockaddr_in6 *) res->ai_addr)->sin6_addr; 
  87.                     break; 
  88.             } 
  89.             inet_ntop(res->ai_family, ptr, addrstr, 100); 
  90.             // sockaddr_in6 in; 
  91.             // memcpy(&in.sin6_addr, ptr, sizeof(ptr)); 
  92.             printf ("IPv%d address: %s (%s)n", res->ai_family == PF_INET6 ? 6 : 4, 
  93.                    addrstr, res->ai_canonname); 
  94.             //printf ("IPv%d address: %s (%s)n", res->ai_family == PF_INET6 ? 6 : 4, 
  95.             //        inet_ntoa(in.sin6_addr), res->ai_canonname); 
  96.             res = res->ai_next; 
  97.         } 
  98.         return 0; 
  99.     } 
  100.     int main (void) 
  101. { 
  102.         printf("startn"); 
  103.         lookup_host(); 
  104. } 
  105.     } 

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 包

(编辑:文山站长网)

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

热点阅读