在IPv4客户端/服务器应用中添加对IPv6的支持-sin6_flowinfo和sin6_scope_id字段吗?

问题描述 投票:23回答:2

我正在努力为多个应用程序实现IPv6支持,但是我想知道这两个字段的用途。这里关于这个的问题很少,所以我不确定我是否正确。

  • 关于范围ID(sin6_scope_id)-好吧,Q1Q2Q3Q4给了我关于范围ID的想法,我想我明白了。因此,我必须再添加一个config参数,以使scope-id可配置。 (如果有人对此感兴趣,我决定在此处添加它)。简短地说-范围ID是唯一确定应该处理流量的设备的必要条件-因为可能存在多个接口,它们具有相同的IP,但具有不同的(接口?)ID。到目前为止,一切都很好。
  • 但是“流信息”(sin6_flowinfo
    • 这是干什么的?我找不到任何有趣的东西。我读了RFC,但对我没有任何帮助。
    • sin6_flowinfo是否有一些可能的值(例如-多个值,例如标志,这意味着什么),或者就像sin6_scope_id-可能是任何值,具体取决于设备,我正尝试连接到?
    • 我应该完全担心它,还是我只留它0(就像Beej's Guide to Network Programming一样。还有,我试过了,它能起作用,但是我不确定它是否只能起作用在这种情况下(如果取决于某些网络配置),或者如果将其设置为0,它将始终有效吗?
    • 或者,也许我应该使它可配置,我的意思是-再添加一个配置选项,并让用户定义它的值?
    • google -ing“ sin6_flowinfo”为我提供了结构定义和手册页,对该字段没有任何帮助。有有趣的资料吗? (可以理解的一个。不是RFC:D)

[EDIT:嗯,在@glglgl的回答之后以及暗示sin6_flowinfo可能已过时的提示之后,我发现了一些有趣的资源:RFC: IPv6 Flow Label SpecificationIETF draft: Flow Label as Transport-Layer NoncePractical guide for solariswikipedia。该字段不是过时的(或者我找不到这种来源,证实了这一点),但是看起来好像0,因为值足够好。

c sockets network-programming ipv6
2个回答
6
投票

最好的方法是使用getaddrinfo()

伪代码:

getaddrinfo()

这将使您担心struct addrinfo *restrict hints = { .ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM }; struct addrinfo * res, r; if (0 == getaddrinfo("foo.bar.baz", "http", &hints, &res)) { for (r=res; r; r=r->ai_next) { sock = socket(r->ai_family, r->ai_socktype, r->ai_protocol); connect(sock, r->ai_addr, r->ai_addrlen); if error: continue break } } freeaddrinfo(res); ;通常为sin6_scope_id,除非您具有本地链接地址,例如0。此fe80::1234:56ff:fe78:9abc%eth2转换为正确的作用域ID。

[eth2已过时(AFAIK),因此在结果sin6_flowinfo中设置为0。


0
投票

一个非常老的问题。由于很多人会无意间遇到这个问题并进入这篇文章(就像我一样),所以您现在可以在2019年找到一些好的文档。

struct addrinfo's ai_addr中所述,

sin6_flowinfo

此字段包含两条信息:交通类别和流标签。

当前,不支持此字段,应将其设置为零以与更高版本兼容。

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