智慧 + 毅力 = 无所不能

正确性、健壮性、可靠性、效率、易用性、可读性、可复用性、兼容性、可移植性...
随笔 - 991, 文章 - 0, 评论 - 27, 阅读 - 341万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

socket支持ipv6

Posted on   Bill Yuan  阅读(2171)  评论(0编辑  收藏  举报

转自:https://www.jianshu.com/p/9926b99a7fef

以前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;  
        }  
    }  
}  
复制代码

 

(评论功能已被禁用)
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示