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

时间:2011-11-24 11:57:47

标签: c sockets network-programming ipv6

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

  • 关于范围ID( sin6_scope_id ) - 好吧,Q1Q2Q3Q4让我了解了范围ID,我想我明白了。因此,我必须添加一个配置参数,以使scope-id可配置。 (我决定在这里添加,以防有人对此感兴趣)。短时间 - 范围ID是唯一确定哪个设备应该处理流量所必需的 - 因为可能有多个接口,具有相同的IP,但具有不同的(接口?)ID。到目前为止,这么好。
  • 但是"流量信息" ( sin6_flowinfo
    • 它的用途是什么?我无法找到任何有趣的东西。我读了RFC,但它根本没有帮助我。
    • sin6_flowinfo是否有一些可能的值(比如 - 几个值,如旗帜,这意味着什么),或者像sin6_scope_id - 可能是任何值,具体取决于设备,我试图连接到?
    • 我应该担心它,或者我只是留下它0(如Beej's Guide to Network Programming中所示。而,我试过,它有效,但我和#39;我不确定它是否仅适用于这种情况(如果它取决于某些网络配置),或者如果它设置为0它将始终有效?
    • 或者,也许,我应该让它可配置,我的意思是 - 添加一个配置选项并让用户定义它的价值?
    • google - ing" sin6_flowinfo"给我结构定义和手册页,对这个领域没有任何用处。任何有趣的来源? (可理解的一个......不是RFC:D)

编辑 :嗯,在@glglgl的答案之后,在提示后,sin6_flowinfo可能已经过时,我发现了一些有趣的消息来源:RFC: IPv6 Flow Label SpecificationIETF draft: Flow Label as Transport-Layer NoncePractical guide for solariswikipedia 该字段不是过时的(或者我无法找到这样的来源,这证实了这一点),但它看起来像0,因为价值足够好。

1 个答案:

答案 0 :(得分: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);

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

sin6_flowinfo已过时(AFAIK),因此在生成的struct addrinfo's ai_addr中设为0。