这几天送审的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 ;
}