原生socket支持ipv6

以前cocos2d-x的項(xiàng)目里都使用的是libwebsocket,如果想支持ipv6,只需要升級(jí)相應(yīng)的庫(kù)即可,現(xiàn)在有個(gè)項(xiàng)目里使用的是原生socket,如果要支持ipv6可能需要進(jìn)行一些代碼的改造,具體可參考如下代碼:

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;  
  
//判定網(wǎng)絡(luò)類(lèi)型    指定特定接口信息  
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;  
        }  
    }  
}  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容