getaddrinfo测试

getaddrinfo测试对 getaddrinfo 函数进行测试 在 Windows 和 Linux 环境下 IPv4 的地址返回与输入均保持一致 在 Windows 环境下 IPv6 地址返回的 ai family 值为 23 而在 Linux 下则为 10 对于输入 IP 为 和 0 的情况 这两个环境返回的 IP 值均被置为 Windows 环境解析 Linux 的 IPv6 地址格式 fe80 20c 29ff fed5 82f ens33 失败 而 Linux 环境解析 Windows 的 IPv6 地址格式 fe80 59d8 5d6d 25

对getaddrinfo 函数进行测试

在Windows和Linux环境下,IPv4的地址返回与输入均保持一致。

在Windows环境下,IPv6地址返回的ai_family值为23,而在Linux下则为10。

对于输入IP为 ::和::0 的情况,这两个环境返回的IP值均被置为 ::。

Windows环境解析Linux的IPv6地址格式:fe80::20c:29ff:fed5:82f%ens33 失败,

而Linux环境解析Windows的IPv6地址格式:fe80::59d8:5d6d:25cc:42cf%14 成功。

 #include 
  
    #include 
   
     #include 
    
      #ifdef WINDOWS #include 
     
       #pragma comment(lib,"ws2_32.lib") #endif // WINDOWS #ifdef LINUX #include 
      
        #include 
       
         #endif // LINUX using namespace std; int ParseSockAddr(const struct sockaddr* addr, string& ip, int& port) { void* numeric_addr = nullptr; if (AF_INET == addr->sa_family) { numeric_addr = &((struct sockaddr_in*)addr)->sin_addr; port = ntohs(((struct sockaddr_in*)addr)->sin_port); } else if (AF_INET6 == addr->sa_family) { numeric_addr = &((struct sockaddr_in6*)addr)->sin6_addr; port = ntohs(((struct sockaddr_in6*)addr)->sin6_port); } else { return -1; } char addr_buff[INET6_ADDRSTRLEN]; if (inet_ntop(addr->sa_family, numeric_addr, addr_buff, sizeof(addr_buff)) == nullptr) return -1; ip = addr_buff; return 0; } void PrintAddr(const struct addrinfo* addr) { printf("ai_flags:[%d], ai_family[%d], ai_socktype[%d], ai_protocol[%d], ai_addrlen[%d], ai_canonname[%s]\n", addr->ai_flags, addr->ai_family, addr->ai_socktype, addr->ai_protocol, addr->ai_addrlen, addr->ai_canonname); string ip; int port = 0; auto ret = ParseSockAddr(addr->ai_addr, ip, port); printf("ParseSockAddr: ret[%d], Address<%s|%d>\n", ret, ip.c_str(), port); } int main() { #ifdef WINDOWS cout << "ON WINDOWS" << endl; WSADATA initData; initData.wVersion = 0; initData.wHighVersion = 2; memset(initData.szDescription, 0, sizeof(initData.szDescription)); memset(initData.szSystemStatus, 0, sizeof(initData.szSystemStatus)); initData.iMaxSockets = 100; initData.lpVendorInfo = nullptr; if (WSAStartup(2, &initData) != 0) { std::cout << "SocketInit Failed!" << std::endl; } #endif #ifdef LINUX cout << "ON LINUX" << endl; #endif set 
        
          ips = { "::", "::0","::1", "fe80::20c:29ff:fed5:82f","fe80::20c:29ff:fed5:82f%ens33", "fe80::59d8:5d6d:25cc:42cf%14", "0.0.0.0", "127.0.0.1","192.168.137.129" }; addrinfo hints, * res; memset(&hints, 0, sizeof(hints)); hints.ai_flags = AI_PASSIVE; hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_IP; auto port = "10000"; cout << endl; for (auto& ip : ips) { auto ret = getaddrinfo(ip.c_str(), port, &hints, &res); printf("getaddrinfo: ret[%d], SrcAddress:<%s|%s>\n", ret, ip.c_str(), port); while (res != nullptr) { PrintAddr(res); res = res->ai_next; } cout << endl; } cout << endl; return 0; } 
         
        
       
      
     
    
  

Windows输出:

ON WINDOWS getaddrinfo: ret[0], SrcAddress:<0.0.0.0|10000> ai_flags:[4], ai_family[2], ai_socktype[1], ai_protocol[0], ai_addrlen[16], ai_canonname[(null)] ParseSockAddr: ret[0], Address<0.0.0.0|10000> getaddrinfo: ret[0], SrcAddress:<127.0.0.1|10000> ai_flags:[4], ai_family[2], ai_socktype[1], ai_protocol[0], ai_addrlen[16], ai_canonname[(null)] ParseSockAddr: ret[0], Address<127.0.0.1|10000> getaddrinfo: ret[0], SrcAddress:<192.168.137.129|10000> ai_flags:[4], ai_family[2], ai_socktype[1], ai_protocol[0], ai_addrlen[16], ai_canonname[(null)] ParseSockAddr: ret[0], Address<192.168.137.129|10000> getaddrinfo: ret[0], SrcAddress:<::|10000> ai_flags:[4], ai_family[23], ai_socktype[1], ai_protocol[0], ai_addrlen[28], ai_canonname[(null)] ParseSockAddr: ret[0], Address<::|10000> getaddrinfo: ret[0], SrcAddress:<::0|10000> ai_flags:[4], ai_family[23], ai_socktype[1], ai_protocol[0], ai_addrlen[28], ai_canonname[(null)] ParseSockAddr: ret[0], Address<::|10000> getaddrinfo: ret[0], SrcAddress:<::1|10000> ai_flags:[4], ai_family[23], ai_socktype[1], ai_protocol[0], ai_addrlen[28], ai_canonname[(null)] ParseSockAddr: ret[0], Address<::1|10000> getaddrinfo: ret[0], SrcAddress: 
  
    ai_flags:[4], ai_family[23], ai_socktype[1], ai_protocol[0], ai_addrlen[28], ai_canonname[(null)] ParseSockAddr: ret[0], Address 
   
     getaddrinfo: ret[11001], SrcAddress: 
    
      getaddrinfo: ret[0], SrcAddress: 
     
       ai_flags:[4], ai_family[23], ai_socktype[1], ai_protocol[0], ai_addrlen[28], ai_canonname[(null)] ParseSockAddr: ret[0], Address 
       
       
      
     
    
  

Linux输出:

ON LINUX getaddrinfo: ret[0], SrcAddress:<0.0.0.0|10000> ai_flags:[1], ai_family[2], ai_socktype[1], ai_protocol[6], ai_addrlen[16], ai_canonname[(null)] ParseSockAddr: ret[0], Address<0.0.0.0|10000> getaddrinfo: ret[0], SrcAddress:<127.0.0.1|10000> ai_flags:[1], ai_family[2], ai_socktype[1], ai_protocol[6], ai_addrlen[16], ai_canonname[(null)] ParseSockAddr: ret[0], Address<127.0.0.1|10000> getaddrinfo: ret[0], SrcAddress:<192.168.137.129|10000> ai_flags:[1], ai_family[2], ai_socktype[1], ai_protocol[6], ai_addrlen[16], ai_canonname[(null)] ParseSockAddr: ret[0], Address<192.168.137.129|10000> getaddrinfo: ret[0], SrcAddress:<::|10000> ai_flags:[1], ai_family[10], ai_socktype[1], ai_protocol[6], ai_addrlen[28], ai_canonname[(null)] ParseSockAddr: ret[0], Address<::|10000> getaddrinfo: ret[0], SrcAddress:<::0|10000> ai_flags:[1], ai_family[10], ai_socktype[1], ai_protocol[6], ai_addrlen[28], ai_canonname[(null)] ParseSockAddr: ret[0], Address<::|10000> getaddrinfo: ret[0], SrcAddress:<::1|10000> ai_flags:[1], ai_family[10], ai_socktype[1], ai_protocol[6], ai_addrlen[28], ai_canonname[(null)] ParseSockAddr: ret[0], Address<::1|10000> getaddrinfo: ret[0], SrcAddress: 
  
    ai_flags:[1], ai_family[10], ai_socktype[1], ai_protocol[6], ai_addrlen[28], ai_canonname[(null)] ParseSockAddr: ret[0], Address 
   
     getaddrinfo: ret[0], SrcAddress: 
    
      ai_flags:[1], ai_family[10], ai_socktype[1], ai_protocol[6], ai_addrlen[28], ai_canonname[(null)] ParseSockAddr: ret[0], Address 
     
       getaddrinfo: ret[0], SrcAddress: 
      
        ai_flags:[1], ai_family[10], ai_socktype[1], ai_protocol[6], ai_addrlen[28], ai_canonname[(null)] ParseSockAddr: ret[0], Address 
        
        
       
      
     
    
  

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/220968.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午7:14
下一篇 2026年3月17日 下午7:14


相关推荐

  • OpenTracing 详解

    OpenTracing 详解OpenTracing 于 2016 年 10 月加入 CNCF 基金会 是继 Kubernetes 和 Prometheus 之后 第三个加入 CNCF 的开源项目 它是一个中立的 厂商无关 平台无关 分布式追踪的 API 规范 提供统一接口 可方便开发者在自己的服务中集成一种或多种分布式追踪的实现 本文讲一讲 OpenTracing 的来龙去脉 以及在容器化和微服务盛行的今天 为什么分布式追踪显得格外有用 DistributedT 什么是 Tracing 图片来源 Metrics t

    2026年3月16日
    2
  • redis分布式锁的应用场景有哪些_分布式锁使用场景举例

    redis分布式锁的应用场景有哪些_分布式锁使用场景举例为什么需要分布式锁分布式锁是实现用户进程同步的一种方式,需要注意的是,Redis是分布式锁实现的一种技术,而不是作用对象多用户进程请求服务的场景很多,为什么分布式锁并不普遍应用?首先需要定义一下分布式锁的原理和使用场景使用场景原子锁—线程同步,一个程序下的多线程之间对于共享变量进行同步,如计数器分布式锁—进程同步,集群下的多服务进程之间对于共享资源进行同步,如数据库可以明确的是数据库已经实现这种“锁”的机制了,因为它的事务锁机制,虽然多个用户I/O之间会出现数据短暂的不.

    2025年8月26日
    9
  • 快播创始人王欣成立人工智能公司[通俗易懂]

    快播创始人王欣成立人工智能公司[通俗易懂]快播创始人王欣成立人工智能公司

    2022年4月20日
    66
  • CHORD-X深度研究报告生成终端MySQL数据库集成教程:数据持久化与报告管理

    CHORD-X深度研究报告生成终端MySQL数据库集成教程:数据持久化与报告管理

    2026年3月14日
    2
  • SpringBoot启动一下就停止了_win10安装boot运行失误

    SpringBoot启动一下就停止了_win10安装boot运行失误springboot启动失败原因:本文想做一个系统管理,在springboot下进行开发,但是提交代码时出现启动失败,上网搜索发现各种原因主要包括:1说@EnableAutoConfiguration注解没加.2说@SpringBootApplication注解没加3说springboot-中包含tomcat疑问,删除maven依赖,重新下载解决’4说spring-boot-starter-parent依赖冲突,删除一个即可5说启动类要和项目在同一级下

    2025年10月14日
    3
  • 简单线段树模板[通俗易懂]

    简单线段树模板[通俗易懂]例如: 给你任意几个数,给定N个区间,让你求这个区间的和;简单线段树的运用,帮助我更好的理解线段树,           //线段树基本#include#defineMAXN100100#defineMINN10000100int num[MAXN],t[MINN];voidbuild(intL,intR,intd){     if(L==R)

    2022年8月30日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号