美文网首页
原生socket支持ipv6

原生socket支持ipv6

作者: 张晓刚_云字节 | 来源:发表于2017-01-21 19:55 被阅读584次

以前cocos2d-x的项目里都使用的是libwebsocket,如果想支持ipv6,只需要升级相应的库即可,现在有个项目里使用的是原生socket,如果要支持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;  
        }  
    }  
}  

相关文章

  • 原生socket支持ipv6

    以前cocos2d-x的项目里都使用的是libwebsocket,如果想支持ipv6,只需要升级相应的库即可,现在...

  • Unity IPv6 Socket 支持

    Unity IPv6 几点注意事项: 1.unity版本: 4.7.2f1(此为我用的版本) 2.服务器IP地址 ...

  • iOS开发之IPv6 socket编程

    研究IPv6 socket编程原因: Supporting IPv6 in iOS 9 WWDC2015苹果宣布在...

  • iOS应用支持IPV6,就那点事儿

    苹果公司6月1日后发布的应用必须支持IPv6-Only网络的解决办法(底层socket连接的IPv6支持方案) 苹...

  • GCDAsynSocket之TCP简析

    GCDAsynSocket是一个开源的基于GCD的异步的socket库。它支持IPV4和IPV6地址,TLS/SS...

  • IM通信原理

    前言 这里我只是讲大概的原理,不会深入的讲.以后有空再补上 关于socket 支持IPV6 ;只要使用一句话 加密...

  • 支持IPV6方法

    由于在应用中使用了网络诊断的组件,大量使用了底层的 socket API,所以对于IPV6支持,这块是个重头戏。如...

  • iOS开发笔记-87:检测服务器是否支持ipv6

    被苹果拒绝,说ipv6不支持让后端服务器支持ipv6后,到这个ipv6测试网站,把自己公司的域名输入,检测,把支持...

  • Socket编程

    (1)服务器根据地址类型(ipv4,ipv6)、socket类型、协议创建socket。 (2)服务器为socke...

  • iOS----如何检查域名是否支持ipv6

    一、iOS----如何检查域名是否支持ipv6 iOS----------如何检查域名是否支持ipv6 1.检查你...

网友评论

      本文标题:原生socket支持ipv6

      本文链接:https://www.haomeiwen.com/subject/rqrnbttx.html