底层socket 支持ip6问题

    struct sockaddr_in6 dest;
    if ((m_sockClient = socket(AF_INET6, SOCK_STREAM, 0)) < 0)
    {
        printf("ipv6,未连接");// IPv6
    }
    printf("socket Ok!");
    
    bzero(&dest, sizeof(dest));
    dest.sin6_family = AF_INET6;     // IPv6
    dest.sin6_port = htons(nServerPort);     // IPv6
    if (inet_pton(AF_INET6, domainToIP(pszServerIP).c_str(), &dest.sin6_addr) < 0 ) {                 // IPv6
        return false;
    }
    printf("address created/n");
    
    int ret = connect(m_sockClient, (struct sockaddr *) &dest, sizeof(dest));
    if ( ret == SOCKET_ERROR ) {
        int ell = errno;
        printf("%d", errno);
        return false;
    }

使用如上代码进行socket connect时失败,这个是不是要改服务器代码才能连接成功啊(服务器代码还是之前连ip4的代码)

服务器代码不用改,只改客户端就可以了,首先确保你的网络环境是IPV6下,然后通过
getaddrinfo,inet_ntop获取服务器IP的IPV6信息(IPV4的IPV6表现形式),再进行IPV6的socket连接即可,大概代码如下:
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
case AF_INET6://ipv6
inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)sa)->sin6_addr),
ip, 128);

这样我试过,不行 connect失败

char strPort[100];
sprintf(strPort,"%d",nServerPort);

    struct addrinfo *ailist, *aip;
    struct addrinfo hint;
    struct sockaddr_in *sinp;
    int sockfd;
    int err;
    char seraddr[INET_ADDRSTRLEN];
    short serport;
    
    hint.ai_family = 0;
    hint.ai_socktype = SOCK_STREAM;
    hint.ai_flags = AI_CANONNAME;
    hint.ai_protocol = 0;
    hint.ai_addrlen = 0;
    hint.ai_addr = nullptr;
    hint.ai_canonname = nullptr;
    hint.ai_next = nullptr;
    if ((err = getaddrinfo(pszServerIP, strPort, &hint, &ailist)) != 0) {
        printf("getaddrinfo error: %s\n", gai_strerror(err));
        return -1;
    }

    printf("getaddrinfo ok\n");
    for (aip = ailist; aip != NULL; aip = aip->ai_next) {
        
        sinp = (struct sockaddr_in *)aip->ai_addr;
        if (inet_ntop(sinp->sin_family, &sinp->sin_addr, seraddr, INET_ADDRSTRLEN) != nullptr)
        {
            printf("server address is %s\n", seraddr);
        }
        serport = ntohs(sinp->sin_port);
        printf("server port is %d\n", serport);
        if ((m_sockClient = socket(aip->ai_family, SOCK_STREAM, 0)) < 0) {
            printf("create socket failed: %s\n", strerror(errno));
            continue;
        }
        printf("create socket ok\n");
        if (connect(m_sockClient, aip->ai_addr, aip->ai_addrlen) < 0) {
            printf("can't connect to %s: %s\n", pszServerIP, strerror(errno));
            continue;  
        }
        break;  
    }  
    freeaddrinfo(ailist);

使用域名改成上面的代码可以连接成功,但是send数据之后recv不到

测试环境是安照官方搭的吗?
这有一个参考
https://github.com/halx99/xxsocket

http://git.oschina.net/halx99/xxsocket