yinggggggg 2019-02-27 16:45 采纳率: 22.2%
浏览 1478
已结题

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地址如下,不会有错
图片说明

  • 写回答

3条回答 默认 最新

  • colin_que 2019-11-13 09:54
    关注

    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 就可以正常进行通信。

    评论

报告相同问题?

悬赏问题

  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题