vcap无法打开[udp @ 0x56378e8a76a0]绑定失败:权限被拒绝

问题描述 投票:0回答:1

我试图使用带有ipv6地址的opencv的VideoCapture功能从我的覆盆子pi流到我的debian虚拟机,但是当我尝试时,我在标题中收到错误。

我已经确认使用netcat和mplayer可以使用以下内容访问ipv6地址:

Debian主机:

netcat -l -6 -u 2222

树莓派:

/ opt / vc / bin / raspivid -t 0 -w 300 -h 300 -hf -fps 20 -o - | nc -u(ipv6地址)2222

码:

    VideoCapture vcap;

     const string videoStreamAddress = "udp://" + "(my Ipv6 address)" + ":2222";

 vcap.open(videoStreamAddress);

编辑:我已经确认vcap.open工作,127.0.0.1,但问题是它仍然无法使用我的ipv6地址

opencv udp ipv6
1个回答
1
投票

以您指定的格式使用的IPv6地址<protocol>://必须括在括号中([])。这最初在RFC 2732, Format for Literal IPv6 Addresses in URL's中指定并在RFC 3896:, Uniform Resource Identifier (URI): Generic Syntax继续:

3.2.2。主办

权限的主机子组件由封装在方括号内的IP文字,点分十进制形式的IPv4地址或注册名称标识。主机子组件不区分大小写。 URI中存在主机子组件并不意味着该方案需要访问Internet上的给定主机。在许多情况下,主机语法仅用于重用为DNS创建和部署的现有注册过程,从而获得全局唯一名称,而无需部署其他注册表。但是,此类使用需要自己承担费用:域名所有权可能会因URI生产者未预料到的原因而发生变化。在其他情况下,主机组件中的数据标识与Internet主机无关的注册名称。我们使用名称“host”作为ABNF规则,因为这是它最常见的目的,而不是它的唯一目的。

  host        = IP-literal / IPv4address / reg-name

主机的语法规则不明确,因为它不能完全区分IPv4地址和注册名称。为了消除语法歧义,我们应用“first-match-wins”算法:如果host匹配IPv4address的规则,则应将其视为IPv4地址文字,而不是reg-name。尽管host不区分大小写,但为了统一性,生产者和规范化器应使用小写的注册名称和十六进制地址,而只使用大写字母表示百分比编码。

由Internet协议文字地址版本6 [RFC3513]或更高版本标识的主机通过将IP文本括在方括号(“[”和“]”)中来区分。这是URI语法中唯一允许使用方括号字符的位置。在预期未来,尚未定义的IP文字地址格式时,实现可以使用可选的版本标志来明确地指示这种格式而不是依赖于启发式确定。

  IP-literal = "[" ( IPv6address / IPvFuture  ) "]"

  IPvFuture  = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )

版本标志不表示IP版本;相反,它表示文字格式的未来版本。因此,实现不得为下面描述的现有IPv4和IPv6文字地址表单提供版本标志。如果包含以“v”(不区分大小写)开头的IP文本的URI(表示存在版本标志)被不知道该版本标志含义的应用程序取消引用,则应用程序应返回“不支持地址机制”的相应错误。

由IPv6文字地址标识的主机在方括号内表示,没有前面的版本标志。这里提供的ABNF是[RFC3513]中提供的IPv6文字地址的文本定义的翻译。此语法不支持IPv6作用域寻址区域标识符。

128位IPv6地址分为8个16位片段。每个部分用不区分大小写的十六进制数字表示,使用一到四个十六进制数字(允许前导零)。八个编码的片段首先被赋予最重要的,由冒号字符分隔。可选地,最不重要的两个部分可以替代地以IPv4地址文本格式表示。可以省略地址内的一个或多个连续的零值16位片段的序列,省略它们的所有数字并在它们的位置留下恰好两个连续的冒号以标记省略号。

  IPv6address =                            6( h16 ":" ) ls32
              /                       "::" 5( h16 ":" ) ls32
              / [               h16 ] "::" 4( h16 ":" ) ls32
              / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
              / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
              / [ *3( h16 ":" ) h16 ] "::"    h16 ":"   ls32
              / [ *4( h16 ":" ) h16 ] "::"              ls32
              / [ *5( h16 ":" ) h16 ] "::"              h16
              / [ *6( h16 ":" ) h16 ] "::"

  ls32        = ( h16 ":" h16 ) / IPv4address
              ; least-significant 32 bits of address

  h16         = 1*4HEXDIG
              ; 16 bits of address represented in hexadecimal

由IPv4文字地址标识的主机以点分十进制表示法(由0到255的四个十进制数字的序列,用“。”分隔)表示,如[RFC1123]中参考[RFC0952]所述。请注意,其他形式的点分表示法可能会在某些平台上解释,如第7.4节所述,但此语法只允许四个八位字节的点分十进制形式。

  IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet

  dec-octet   = DIGIT                 ; 0-9
              / %x31-39 DIGIT         ; 10-99
              / "1" 2DIGIT            ; 100-199
              / "2" %x30-34 DIGIT     ; 200-249
              / "25" %x30-35          ; 250-255

由注册名称标识的主机是通常用于在本地定义的主机或服务名称注册表中查找的字符序列,尽管URI的特定于方案的语义可能需要使用特定的注册表(或固定名称表)。最常见的名称注册机制是域名系统(DNS)。用于在DNS中查找的注册名称使用[RFC1034]的第3.5节和[RFC1123]的第2.1节中定义的语法。这样的名称由一系列由“。”分隔的域标签组成,每个域标签以字母数字字符开头和结尾,可能还包含“ - ”字符。 DNS中完全限定域名的最右侧域名标签后面可能跟有单个“。”。并且应该是有必要区分完整的域名和一些本地域。

  reg-name    = *( unreserved / pct-encoded / sub-delims )

如果URI方案定义了host的默认值,那么当主机子组件未定义或注册名称为空(零长度)时,该默认值适用。例如,定义“文件”URI方案,使得没有权限,空主机和“localhost”都表示最终用户的机器,而“http”方案认为缺少权限或空主机无效。

本规范并未强制要求使用特定的注册名称查找技术,因此不会将注册的语法限制在互操作性所需的范围之外。相反,它将注册名称语法一致性的问题委托给执行URI解析的每个应用程序的操作系统,并且该操作系统决定它将允许用于主机识别的目的。 URI解析实现可能使用DNS,主机表,黄页,NetInfo,WINS或任何其他系统来查找已注册的名称。但是,对于具有全局范围的URI,必须使用全局范围的命名系统,例如DNS完全限定的域名。 URI生成器应使用符合DNS语法的名称,即使DNS的使用不明显,也应将这些名称限制为不超过255个字符。

reg-name语法允许百分比编码的八位字节,以便以统一的方式表示非ASCII注册名称,独立于基础名称解析技术。必须首先根据UTF-8 [STD63]对非ASCII字符进行编码,然后必须对相应UTF-8序列的每个八位字节进行百分比编码,以表示为URI字符。 URI生成应用程序不得在主机中使用百分比编码,除非它用于表示UTF-8字符序列。当非ASCII注册名称表示要通过DNS解析的国际化域名时,必须在名称查找之前将名称转换为IDNA编码[RFC3490]。如果URI生成者希望最大化与传统URI解析器的互操作性,则应该以IDNA编码提供这些注册名称,而不是百分比编码。

© www.soinside.com 2019 - 2024. All rights reserved.