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

我致力于为多个应用程序实现IPv6支持,但我想知道这两个字段是什么。 关于这一点的问题很少,所以我不确定我做对了。

  • 关于范围ID( sin6_scope_id ) – 好吧, Q1Q2Q3Q4给了我关于范围ID的想法,我想我明白了。 所以,我将不得不再添加一个配置参数,以使scope-id可配置。 (我决定在这里添加,以防有人对此感兴趣)。 短时间 – 范围ID是唯一确定哪个设备应该处理流量所必需的 – 因为可能有多个接口,具有相同的IP,但具有不同的(接口?)ID。 到现在为止还挺好。
  • 但是“流量信息”怎么样( sin6_flowinfo
    • 它是为了什么? 我找不到任何有趣的东西。 我阅读了RFC,但它根本没有帮助我。
    • sin6_flowinfo是否有一些可能的值(比如 – 几个值,比如标志,这意味着什么),或者就像sin6_scope_id – 可能是任何值,取决于设备,我正在尝试连接?
    • 我应该担心它,或者我只是把它留下0 (就像在Beej的网络编程指南中一样 。 是的 ,我尝试过,它有效,但我不确定它是否只适用于这种情况(如果它取决于某些网络配置),如果它设置为0 ,它将始终有效?
    • 或者,也许,我应该让它可配置,我的意思是 – 添加一个配置选项,让用户定义它的值?
    • google -ing“sin6_flowinfo”给了我结构定义和手册页,这个字段没什么用处。 任何有趣的来源? (可理解的一个……不是RFC:D)

编辑 :嗯,在@glglgl的回答和提示之后, sin6_flowinfo可能已经过时了,我发现了一些有趣的资料来源: RFC:IPv6流标签规范IETF草案:流标签作为传输层Noncesolaris实用指南维基百科
该字段不是过时的(或者我找不到这样的来源,这证实了这一点),但它看起来像0因为价值足够好。

最好的方法是使用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 。 此eth2将转换为正确的范围ID。

sin6_flowinfo已过时(AFAIK),因此在生成的struct addrinfoai_addr设置为0。