ios安卓SDK可以在不同的网络自动判断当前所属的网络是ipv4还是ipv6
下面放一小段代码,自己也记录一下:
evutil_socket_t short_sfd;
struct addrinfo info = {0}, *pRet = NULL, *pCur = NULL;
info.ai_family = PF_UNSPEC;
info.ai_flags = 0;
info.ai_protocol = 0;
info.ai_socktype = SOCK_STREAM;
std::string port_str = utils::t2string(port );
if(getaddrinfo(server_ip.c_str(), port_str.c_str(), &info, &pRet) != 0)
{
return CANT_CONNECT_SERVER;
}
int count = 0;
for(pCur = pRet; pCur != NULL; pCur = pCur->ai_next)
{
++count;
printf("count == %d\n", count);
short_sfd = socket(pCur->ai_addr->sa_family, pCur->ai_socktype, 0);
printf("server_ip change ++++++== %hhu\n", pCur->ai_addr->sa_family);
assert(short_sfd > 0);
if (short_sfd == -1){
continue;
}
//创建套接字成功后设置其可重用的属性
int KeepAlive=1;
socklen_t KPlen=sizeof(int);
if(setsockopt(short_sfd ,SOL_SOCKET,SO_REUSEADDR,(char *)&KeepAlive,KPlen)!=0){
perror("设置周期测试连接是否仍存活失败!/n");
}
int salen;
if (pCur->ai_addr->sa_family == AF_INET){
salen = sizeof(*(pCur ->ai_addr));
printf("11111pCur ->ai_addr->sa_family before salen == %d\n",pCur ->ai_addr->sa_family);
}
else{
salen = sizeof(struct sockaddr_in6);
printf("22222pCur ->ai_addr->sa_family salen == %d\n",pCur ->ai_addr->sa_family);
}
printf("connect_nonb before salen == %d\n", salen);
if ((ret = connect_nonb(short_sfd, pCur ->ai_addr, (socklen_t )salen, timeout_sec)) >= 0)
break;
}
if (ret < 0)
{
printf("connect_nonb ret === %d\n",ret);
if (-2 == ret)
{
close(short_sfd);
return CANT_CONNECT_SERVER;
}
else
{
close(short_sfd);
return CONN_OTHER_ERROR;
}
}
freeaddrinfo(pRet);