IPv6:connect() 总是失败并显示 errno 22

2024-01-23

操作系统是Ubuntu。 我正在对基本 IPv6 操作进行简单测试。 PC通过集线器与IP Camera(支持IPv6)连接。 ping6 测试成功。

$ ping6 -I eth1 fe80::240:8cff:fe94:451e
PING fe80::240:8cff:fe94:451e(fe80::240:8cff:fe94:451e) from fe80::224:8cff:fe90:ad3b eth1: 56 data bytes
64 bytes from fe80::240:8cff:fe94:451e: icmp_seq=1 ttl=64 time=3.86 ms
64 bytes from fe80::240:8cff:fe94:451e: icmp_seq=2 ttl=64 time=0.471 ms

代码如下:

#include <linux/in6.h>
#include <sys/socket.h>
#include <stdio.h>
#include <errno.h>

void main()
{
  int s, ret, err;
  struct sockaddr_in6 addr;

  s = socket(AF_INET6, SOCK_STREAM, 0);
  addr.sin6_family = AF_INET6;
  addr.sin6_port = htons(554);
  addr.sin6_flowinfo = 0;
  addr.sin6_scope_id = 0;
  addr.sin6_addr.s6_addr[0] = 0xfe;
  addr.sin6_addr.s6_addr[1] = 0x80;
  addr.sin6_addr.s6_addr[2] = 0x00;
  addr.sin6_addr.s6_addr[3] = 0x00;
  addr.sin6_addr.s6_addr[4] = 0x00;
  addr.sin6_addr.s6_addr[5] = 0x00;  
  addr.sin6_addr.s6_addr[6] = 0x00;
  addr.sin6_addr.s6_addr[7] = 0x00;
  addr.sin6_addr.s6_addr[8] = 0x02;
  addr.sin6_addr.s6_addr[9] = 0x40;
  addr.sin6_addr.s6_addr[10] = 0x8c;
  addr.sin6_addr.s6_addr[11] = 0xff;
  addr.sin6_addr.s6_addr[12] = 0xfe;
  addr.sin6_addr.s6_addr[13] = 0x94;
  addr.sin6_addr.s6_addr[14] = 0x45;
  addr.sin6_addr.s6_addr[15] = 0x1e;

  ret = connect(s, (struct sockaddr*)&addr, sizeof(addr));
  if (ret == -1)
  {
    err = errno;
    printf("connect failure, errno = %d\n", err);
  }
}

结果始终是“连接失败,errno = 22” 哪里有问题?


如果您要使用链接本地地址,则必须设置sin6_scope_id匹配链路上网络设备的设备索引(这就是为什么你必须指定-I eth1给你的ping6命令)。

你可以有getaddrinfo()为您完成所有艰苦的工作,包括设置范围 ID(请注意%eth1在地址末尾)和端口:

struct addrinfo hints = { 0 };
struct addrinfo *res;
int gai_err;
int s;

hints.ai_family = AF_INET6;
hints.ai_socktype = SOCK_STREAM;

gai_err = getaddrinfo("fe80::240:8cff:fe94:451e%eth1", "554", &hints, &res);

if (gai_err)
{
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(gai_err));
    return 1;
}

s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);

if (s < 0) {
    perror("socket");
    return 1;
}

if (connect(s, res->ai_addr, res->ai_addrlen) < 0) {
    perror("connect");
    return 1;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IPv6:connect() 总是失败并显示 errno 22 的相关文章

随机推荐

  • jsTree 对象没有方法 addBack

    这是我的 jsTree 实例化代码 folder tree jstree themes theme default dots true icons true json data ajax url portal folders data fu
  • Android - 两个 onClick 监听器和一个按钮

    我有一个可点击的自定义 TextView 它定义了自己的 onClick 处理程序 以便根据点击更改其外观 但是 如果我随后在活动中定义第二个 onClick 处理程序以便根据单击的按钮执行某些操作 则仅调用其中一个 onClick 函数
  • 为 NixOS 打包 jetbrains-toolbox

    我正在尝试使用jetbrains 工具箱 https www jetbrains com toolbox app 在 NixOS 上 下载的是单个 ELF 二进制文件 我用它修复了 patchelf set interpreter nix
  • [Batch]循环直到按下某个键

    我想做的是循环直到按下 x 我知道CHOICE与 T选项 But CHOICE我想要播放的动画超时时间太长 这是一个例子 echo off cls set frame 2 loop cls type frame txt Here is wh
  • 是否可以根据文件类型使用不同的主题?

    是否可以根据文档类型运行主题 例如 我想要一个用于 js html 的主题 另一个用于 md 文件的主题 这不再是正确的答案 请参阅另一个允许您执行问题所要求的软件包的答案 我试图删除这个答案 但无法做到这一点 因为它是目前接受的答案 不
  • C# 添加浮点数表现得很奇怪[重复]

    这个问题在这里已经有答案了 我正在尝试添加一行单元格并在网格中的新单元格中显示总计 我正在使用 DevExpress 的 gridControl 该网格有 12 列 代表一年中的月份 我想添加月份值并在第 13 列中显示总数 我的问题是 如
  • 调试 VBA 中的空格

    我的表格中有一个单元格 内容如下 641233 之后有某种空格 我认为这是一个空格 所以在我的 vba 代码中 我尝试了多种方法来将这个空格从字符串中取出 但都没有application trim nor replace work With
  • 为什么多个 WHERE 条件会减慢查询而不是加快查询速度?

    问题在于 与使用一两个条件而不是全部三个条件运行的查询相比 所讨论的查询运行速度非常慢 现在查询 Select Count From SearchTable Where Date gt 8 1 2009 AND Zip In Select
  • 缩放 CSS/JavaScript

    我想知道如何通过javascript控制缩放属性 像 div style top 一样 如何指定缩放 Firefox 和 Chrome Webkit 相当于 IE 特定的zoom属性分别是 moz transform https devel
  • 将数组的一部分向右移动的最快方法

    我需要在一个小数组中的给定索引处 插入 一个元素 即 将所有索引较大的元素向右移动 1 位 在 NET 中最快的方法是什么 注意 我添加了自己的答案 但我仍在寻找解释和更快的替代方案 编辑 我确实需要一个数组 而不是List
  • 为什么后台任务会阻止 SimpleHTTPServer 中的响应?

    我正在编写一个简单的基于浏览器的前端 它应该能够启动后台任务 然后从中获取进度 我希望浏览器收到一个响应 说明任务是否成功启动 然后轮询以确定任务何时完成 但是 后台任务的存在似乎会阻止立即发送 XMLHttpRequest 响应 因此我无
  • 无法在 Swift 中调用 Objective C 类方法

    我的项目是用 swift 语言编写的 我在项目中使用过可可豆荚 我使用可可豆荚将 HDAlerts 集成到我的项目中 HDAlerts位于objective c中 因此我在项目中添加了objective c桥接标头并在其中导入了Alerts
  • 我怎样才能让它工作。我尝试授予 sudo 权限

    我目前正在使用linux 并尝试使用 sudo 权限启动应用程序 但没有成功 我刚刚安装了 expo cli 并创建了新项目 当我启动应用程序时 表明 错误信息 Failed to construct transformer Error E
  • 使用 node.js 的服务器端 Mustache.js 示例

    我正在寻找一个使用的例子Mustachejs with Nodejs 这是我的例子 但它不起作用 Mustache未定义 我正在使用 master 分支的 Mustachejs var sys require sys var m requi
  • 无法解析符号 newRequestQueue - Volley

    我在 MainActivity 文件中有这段代码 RequestQueue queue new Volley newRequestQueue this 并且由于某种原因newRequestQueue部分是红色的 当我将鼠标悬停在它上面时 我
  • 表达与陈述

    我问的是关于 c 的问题 但我认为它在大多数其他语言中都是一样的 有谁有一个好的定义表达式 and 声明区别是什么 表达 评估某个值的东西 例子 1 2 x 陈述 执行某事的一行代码 例子 GOTO 100 在最早的通用编程语言 如 FOR
  • 即使 FetchMode = Join,Hibernate 也会发出 select 语句

    我有一个与国家 地区实体映射的 userAccount 实体 UserAccount 类中的国家 地区映射如下 ManyToOne fetch FetchType EAGER Fetch FetchMode JOIN JoinColumn
  • 在使用 window.open 打开的窗口中使用 document.write 编写的脚本元素不会在 Windows 7 上的 IE8 中执行

    我遇到了一个似乎只出现在 Windows 7 上的问题 它似乎在不同版本的 Windows 上的 IE8 中工作正常 基本上 我使用 window open 创建一个新窗口 然后使用 document write 写入该新窗口的内容 其中包
  • 如何在 Yii2 中的 ON 条件中使用常量 hasMany 关系

    我尝试创建一个多态关联 这在 Rails 中很常见 但不幸的是在 Yii2 中却不是 作为实现的一部分 我需要定义关系 public function getImages return this gt hasMany RecipeImage
  • IPv6:connect() 总是失败并显示 errno 22

    操作系统是Ubuntu 我正在对基本 IPv6 操作进行简单测试 PC通过集线器与IP Camera 支持IPv6 连接 ping6 测试成功 ping6 I eth1 fe80 240 8cff fe94 451e PING fe80 2