centos7 c++ bind ipv6失败,错误码22

用一下代码去bind本机的ipv6地址失败,但是绑定::1和0是可以的

{
        int fd, on(1), res;
        struct sockaddr_in6 addr;
        memset(&addr, 0, sizeof(addr));
        addr.sin6_family = AF_INET6;
        addr.sin6_port = htons(port);
        res = inet_pton(AF_INET6, "fe80::7e3a:9e2a:85e0:a9ae", &addr.sin6_addr);

        fd = socket(AF_INET6, SOCK_STREAM, 0);
        if(fd<0)
            goto Fail;
        res = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
        if(bind(fd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in6))<0)
            goto Fail;
        if(listen(fd, num)<0)
            goto Fail;
        return fd;

    Fail:
        err = errno;
        socket_CloseFd(fd);
        return -1;
    }

本机的ipv6地址如下,不会有错
图片说明

server 可以使用 addr.sin6_addr= in6addr_any 进行bind 那么该端口的数据都能收到。
但是client connect server的 fe80:xxxxxx 的本地链路地址会失败,
需要给server分配一个全球链路地址 比如 :2001:470:1f01:f52b::2/64
可以直接给server 手动添加 ip addr add 2001:470:1f01:f52b::2/64 dev eth0
然后client connect 到这个地址 server和 client 就可以正常进行通信。

监听本机, ip串用 ":::" 表示就可以了。

请检查一下ipv6的ip地址是否正确,将addr.sin6_addr = in6addr_any,bind成功,应该是你的ip地址有问题,另外,bind绑定的ip地址是本地地址,你指定的ip地址是不是本地ip地址。

附上程序

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>

int main()
{
    int fd , res;
    int err;
    struct sockaddr_in6 addr;

    memset(&addr, 0, sizeof(addr));
    addr.sin6_family = AF_INET6;
    addr.sin6_port = htons(1000);
    addr.sin6_addr= in6addr_any;
//    res = inet_pton(AF_INET6, "fe80::7e3a:9e2a:85e0:a9ae", &addr.sin6_addr.s_addr);
    printf("res %d\n", res);

    fd = socket(AF_INET6, SOCK_STREAM, 0); 
    if(fd<0)
        goto fail;

    int on = 1;
    res = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
    if (res < 0) {
        goto fail;
    }   
    if(bind(fd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in6))<0)
        goto fail;
    if(listen(fd, 5)<0)
        goto fail;
    return fd; 
fail:
    err = errno;
    close(fd);
    return -1;
}