iOS——socket适配ipv6,同时兼容ipv4

由于iOS苹果审核需要支持ipv6,我公司手游用的socket底层调用的是C标准库,故在此记录下需要调整修改的地方 1、网络环境配置方面,具体参见这篇帖子,:www.code4app.com/thread-8513… 补充说明,由于IPV6需要设备支持,搭建好的IPV6的WIFI,可能电脑跟安卓手机都连接不上,但用苹果手机连接却可以浏览上网,那证明网络OK,可以在真机上进行下一步的代码调试了。 2、原理说明:在访问服务器前,通过getaddrinfo创建对应的网络协议,ipv6网络下可以得到服务器的IPV6地址(其实是IPV4下IP的IPV6写法),通过IPV6地址去访问

这里贴出主要的Connect方法,Connect能连接上了,后面send,recv都是可以的不用修改 Androidios环境下代码,兼容IPV4跟IPV6:

[cpp] view plain copy

bool ODSocket::Connect(const char* domain, unsigned short port)  
{  
复制代码

//连接ip       char ip[128];       memset(ip, 0, sizeof(ip));       strcpy(ip, domain);          void* svraddr = nullptr;       int error=-1, svraddr_len;       bool ret = true;       struct sockaddr_in svraddr_4;       struct sockaddr_in6 svraddr_6;          //获取网络协议       struct addrinfo *result;       error = getaddrinfo(ip, NULL, NULL, &result);       const struct sockaddr *sa = result->ai_addr;       socklen_t maxlen = 128;       switch(sa->sa_family) {           case AF_INET://ipv4               if ((m_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {                   perror("socket create failed");                   ret = false;                   break;               }               if(inet_ntop(AF_INET, &(((struct sockaddr_in *)sa)->sin_addr),                            ip, maxlen) < 0){                   perror(ip);                   ret = false;                   break;               }               svraddr_4.sin_family = AF_INET;               svraddr_4.sin_addr.s_addr = inet_addr(ip);               svraddr_4.sin_port = htons(port);               svraddr_len = sizeof(svraddr_4);               svraddr = &svraddr_4;               break;           case AF_INET6://ipv6               if ((m_sock = socket(AF_INET6, SOCK_STREAM, 0)) < 0) {                   perror("socket create failed");                   ret = false;                   break;               }               inet_ntop(AF_INET6, &(((struct sockaddr_in6 )sa)->sin6_addr),                         ip, maxlen);                              printf("socket created ipv6/n");                              bzero(&svraddr_6, sizeof(svraddr_6));               svraddr_6.sin6_family = AF_INET6;               svraddr_6.sin6_port = htons(port);               if ( inet_pton(AF_INET6, ip, &svraddr_6.sin6_addr) < 0 ) {                   perror(ip);                   ret = false;                   break;               }               svraddr_len = sizeof(svraddr_6);               svraddr = &svraddr_6;               break;                          default:               printf("Unknown AF\ns");               ret = false;       }       freeaddrinfo(result);       if(!ret)       {           fprintf(stderr , "Cannot Connect the server!n");           return false;       }       int nret = connect(m_sock, (struct sockaddr)svraddr, svraddr_len);       if(nret==SOCKET_ERROR )       {           return false;       }          return true;   }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值