C++ IPv4与IPv6的兼容编码

原创 2016年05月30日 18:47:24

 struct addrinfo hints, *res, *ressave;      

bzero(&hints, sizeof(hints));    

hints.ai_family = AF_UNSPEC;  

 hints.ai_socktype = SOCK_STREAM;  

hints.ai_protocol = IPPROTO_IP;  



官网:

https://developer.apple.com/library/mac/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW1



Check Source Code for IPv6 DNS64/NAT64 Incompatibilities

Check for and eliminate IPv4-specific APIs, such as:

  • inet_addr()

  • inet_aton()

  • inet_lnaof()

  • inet_makeaddr()

  • inet_netof()

  • inet_network()

  • inet_ntoa()

  • inet_ntoa_r()

  • bindresvport()

  • getipv4sourcefilter()

  • setipv4sourcefilter()

If your code handles IPv4 types, make sure the IPv6 equivalents are handled too.

IPv4

IPv6

AF_INET

AF_INET6

PF_INET

PF_INET6

struct in_addr

struct in_addr6

struct sockaddr_in

struct sockaddr_in6

kDNSServiceProtocol_IPv4

kDNSServiceProtocol_IPv6

Use System APIs to Synthesize IPv6 Addresses

If your app needs to connect to an IPv4-only server without a DNS hostname, use getaddrinfo to resolve the IPv4 address literal. If the current network interface doesn’t support IPv4, but supports IPv6, NAT64, and DNS64, performing this task will result in a synthesized IPv6 address.

Listing 10-1 shows how to resolve an IPv4 literal using getaddrinfo. Assuming you have an IPv4 address stored in memory as four bytes (such as {192, 0, 2, 1}), this example code converts it to a string (such as "192.0.2.1"), uses getaddrinfo to synthesize an IPv6 address (such as a struct sockaddr_in6 containing the IPv6 address "64:ff9b::192.0.2.1") and tries to connect to that IPv6 address.

Listing 10-1  Using getaddrinfo to resolve an IPv4 address literal

#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <err.h>
 
    uint8_t ipv4[4] = {192, 0, 2, 1};
    struct addrinfo hints, *res, *res0;
    int error, s;
    const char *cause = NULL;
 
    char ipv4_str_buf[INET_ADDRSTRLEN] = { 0 };
    const char *ipv4_str = inet_ntop(AF_INET, &ipv4, ipv4_str_buf, sizeof(ipv4_str_buf));
 
    memset(&hints, 0, sizeof(hints));
    hints.ai_family = PF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = AI_DEFAULT;
    error = getaddrinfo(ipv4_str, "http", &hints, &res0);
    if (error) {
        errx(1, "%s", gai_strerror(error));
        /*NOTREACHED*/
    }
    s = -1;
    for (res = res0; res; res = res->ai_next) {
        s = socket(res->ai_family, res->ai_socktype,
                   res->ai_protocol);
        if (s < 0) {
            cause = "socket";
            continue;
        }
 
        if (connect(s, res->ai_addr, res->ai_addrlen) < 0) {
            cause = "connect";
            close(s);
            s = -1;
            continue;
        }
 
        break;  /* okay we got one */
    }
    if (s < 0) {
        err(1, "%s", cause);
        /*NOTREACHED*/
    }
    freeaddrinfo(res0);

Note: The ability to synthesize IPv6 addresses was added to getaddrinfo in iOS 9.2 and OS X 10.11.2. However, leveraging it does not break compatibility with older system versions. See getaddrinfo(3) Mac OS X Developer Tools Manual Page.


版权声明:本文为博主原创文章,未经博主允许不得转载。

socket兼容IPV4、IPV6网络底层connect写法

由于IOS苹果审核需要支持ipv6,我公司手游用的socket底层调用的是C标准库,故在此记录下需要调整修改的地方 这里贴出主要的Connect方法,Connect能连接上了,后面send,recv都...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

UDP协议下:单一socket复用 IPV4与IPV6地址

最近学习套接字编程,简单的总结了一下IPV4与IPV6地址复用的工作。 UDP协议下:单一socket复用 IPV4与IPV6地址 1服务器端 通常情况下,对于一个简单的UDP服务器,其...

网络编程:Socket编程从IPv4转向IPv6支持

目前运行主流的IT系统中,用于解决分布式系统内部模块及不同的系统间通信的一种主要的解决方案就是使用套接字Socket来开发应用。由于当前大部分正在运行的IT系统中使用套接字Socket开发环境基本上都...
  • Blaider
  • Blaider
  • 2014年10月09日 11:22
  • 5064

c++ 封装ipv6类

一. socket编程函数 1.1   基本函数     socket、bind、listen、connect、read/send、write/recv、close函数。 1.2 信息获取函数  ...

ios c++版本适配ipv6

1.IPV6: 因为现在移动设备越来越多,原来的ip地址似乎不够用了(当初设计的哥们肯定没想到现在人会这么多。。。会这么普及),所以产生来新ip 128个字节表示的地址ipv6 2.IPV4: ipv...

C++中的IPv6网络程序设计

IPv4 最初是由美国国防部开发的用于网际互联(IP)协议,后来它不仅发展了TCP,而且还进一步发展了IPv4(IP 协议4.0版)。IPv4现在已经广泛应用于Internet网络中,同时也应用于大多...

编写C++函数:识别一段string字符串是IPv4还是IPv6

今天做到Calix(南京凯易迅)的笔试题,其中有一题大致意思是:vector中存有string字符串,识别每一个字符串是否是ip地址,三种可能:IPv4、IPv6、Neither,将每个字符串的识别结...
  • Mind_V
  • Mind_V
  • 2017年05月15日 16:06
  • 657

C++ IPv4与IPv6的兼容编码

这里不再对IPv6 socket相关编程的基础知识进行讲解,只提供一个IP协议无关的服务端和客户端的代码,仅供参考。 服务端代码: #include #include #include #inc...

IPv6下网络编程socket, TCP和UDP例子,以及兼容IPV4和IPV6的类

一、TCP socket ipv6与ipv4的区别 服务器端源代码如下: #include #include #include #include #include #include ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ IPv4与IPv6的兼容编码
举报原因:
原因补充:

(最多只允许输入30个字)