IOS开发 TCP socket操作 IPV6环境不兼容问题

这几天送审的IOS的APP被打回来了,原因是IPV6环境下不兼容。网上搜索了很多,最终解决了,这里做个笔记以备忘
代码如下:

int socketConnect(const char *host, int port) {
    struct addrinfo * result;
    struct addrinfo * res;
    struct addrinfo * last = NULL;
    int sockfd = -1;
    int isIpv6 = 0;
    int error;

    error = getaddrinfo(host, NULL, NULL, &result);
    if(error != 0) {
        return -1;
    }
    for(res = result; res!=NULL; res = res->ai_next) {
        last = res;
        if ( res->ai_addr->sa_family == AF_INET6 ) {
            isIpv6 = 1;
            break;
        }
    }

    int ret = -1 ;
    if (isIpv6 == 0 ) {  //IPV4
        struct sockaddr_in dest_addr;
        bzero(&dest_addr, sizeof(dest_addr));
        memcpy(&dest_addr,(struct sockaddr_in *)last->ai_addr , sizeof(struct sockaddr_in))  ;
        dest_addr.sin_port = htons(port);

        sockfd = socket(PF_INET, SOCK_STREAM, 0);
        ret = connect(sockfd, (struct sockaddr *) &dest_addr, sizeof(dest_addr)); 
    }else {  //IPV6
        struct sockaddr_in6 dest_addr;
        bzero(&dest_addr, sizeof(dest_addr));
        memcpy(&dest_addr,(struct sockaddr_in6*)last->ai_addr , sizeof(struct sockaddr_in6))  ;
        dest_addr.sin6_port = htons(port);

        sockfd = socket(PF_INET6, SOCK_STREAM, 0);
        ret = connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
    }

    if ( ret == 0 ) {
        return sockfd;
    }

    return ret ;
}

猜你喜欢

转载自blog.csdn.net/shshheyi/article/details/80612818