IOS 客户端 socket IPV4兼容IPV6

来源:互联网 发布:什么是淘宝客单价 编辑:程序博客网 时间:2024/05/16 03:00

前些天提交代码,被苹果打回了,苹果回复:Specifically, we were unable to access the app. We've attached screenshot for your reference. Apps are reviewed on an IPv6 network. Please ensure that your app supports IPv6 networks, as IPv6 compatibility is required才发现从2016-6-1起,所有提交APPStore的应用必须要支持IPV6网络

struct addrinfo *result;
struct addrinfo *res;

struct addrinfo addrCriteria;
memset(&addrCriteria,0,sizeof(addrCriteria));
addrCriteria.ai_family=AF_UNSPEC;
addrCriteria.ai_socktype=SOCK_STREAM;
addrCriteria.ai_protocol=IPPROTO_TCP;

//判定网络类型    指定特定接口信息
int error = getaddrinfo("www.baidu.com", "1100", &addrCriteria, &result);
if (error == 0)
{
    struct sockaddr_in *sa;
    for (res = result; res != NULL; res = res->ai_next)
    {
        if (AF_INET6 == res->ai_addr->sa_family)
        {
            char buf[128] = {};
            sa = (struct sockaddr_in*)res->ai_addr;
            inet_ntop(AF_INET6, &((reinterpret_cast<struct sockaddr_in6*>(sa))->sin6_addr), buf, 128);
           
            m_sock = socket(res->ai_family, res->ai_socktype, 0);
            if (m_sock == -1) {
                log("error socket create");
                return;
            }
           
            struct sockaddr_in6 svraddr;
            memset(&svraddr, 0, sizeof(svraddr)); //注意初始化
            svraddr.sin6_family = AF_INET6;
            svraddr.sin6_port = htons(port);
            if (inet_pton(AF_INET6,buf,&svraddr.sin6_addr) < 0)
            {
                log("error addr");
            }
            int ret = connect(m_sock, (struct sockaddr*) &svraddr, sizeof(svraddr));
            //TODO....遇到IPv6就退出
            break;
        }
        else if (AF_INET == res->ai_addr->sa_family)
        {
            char buf[32] = {};
            sa = (struct sockaddr_in*)res->ai_addr;
            inet_ntop(AF_INET, &sa->sin_addr), buf, 32);
           
            m_sock = socket(res->ai_family, res->ai_socktype, 0);
            if (m_sock == -1) {
                log("error socket create");
                return;
            }
           
            struct sockaddr_in svraddr;
            svraddr.sin_family = AF_INET;
            svraddr.sin_addr.s_addr = inet_addr(buf);
            svraddr.sin_port = htons(port);
            int ret = connect(m_sock, (struct sockaddr*) &svraddr, sizeof(svraddr));
            //TODO.... break除掉
            //break;
        }
    }
}

 

参考:http://blog.csdn.net/msdb198901/article/details/51654852

 

0 0
原创粉丝点击