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

Kir*_*rov 23 c sockets network-programming ipv6

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

  • 关于范围ID(sin6_scope_id) - 好吧,Q1,Q2,Q3Q4给了我关于范围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草案:流标签作为传输层Nonce, solaris维基百科的实用指南.
该字段不是过时的(或者我找不到这样的来源,这证实了这一点),但看起来0价值已经足够好了.

glg*_*lgl 6

最好的方法是使用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);
Run Code Online (Sandbox Code Playgroud)

这会让你担心sin6_scope_id; 这通常是0,除非你有链接本地地址,如fe80::1234:56ff:fe78:9abc%eth2.这eth2将转换为正确的范围ID.

sin6_flowinfo是过时(AFAIK),从而设置为0在所得struct addrinfoai_addr.

  • @KirilKirov 你是对的:它与过时的完全相反:他们还不知道如何处理它;-) (2认同)
  • 确切地说 - 最好的定义 - “他们还不知道到底该如何处理它” :D:DI 喜欢它!:D (2认同)