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

标签 c sockets network-programming ipv6

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

  • 关于作用域 ID (sin6_scope_id) - 嗯,Q1 , Q2 , Q3Q4让我了解范围 ID,我想我明白了。因此,我必须再添加一个配置参数,以使 scope-id 可配置。 (我决定在这里添加这个,以防有人对此感兴趣)。很快 - 范围 ID 是唯一确定哪个设备应该处理流量所必需的 - 因为可能有多个接口(interface),具有相同的 IP,但具有不同的(接口(interface)?)ID。到目前为止,一切顺利。
  • 但是“流信息”如何 ( sin6_flowinfo )
    • 它有什么用?我找不到任何有趣的东西。我读了RFC但这对我一点帮助都没有。
    • sin6_flowinfo 是否有一些可能的值(比如 - 几个值,比如标志,这意味着什么),或者它像 sin6_scope_id - 可以是任何值,具体取决于在设备上,我正在尝试连接到?
    • 我到底应该担心它,还是我就把它留在 0(如 Beej's Guide to Network Programming 中)。是的,我试过了,它有效,但是我不确定它是否仅在这种情况下有效(如果它取决于某些网络配置),或者如果将其设置为 0,它将始终有效?
    • 或者,也许,我应该让它可配置,我的意思是 - 添加一个配置选项并让用户定义它的值?
    • google-ing “sin6_flowinfo” 给我结构定义和手册页,关于这个字段没有任何用处。有什么有趣的来源吗? (可以理解的……不是 RFC :D )

编辑:好吧,在@glglgl 的回答和提示之后,sin6_flowinfo 可能已过时,我发现了一些有趣的来源: RFC: IPv6 Flow Label Specification , IETF draft: Flow Label as Transport-Layer Nonce , Practical guide for solariswikipedia .
该字段并没有过时(或者我找不到这样的来源,这证实了这一点),但它看起来像 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 addrinfo's ai_addr 中设置为 0 .

关于c - 在 IPv4 客户端/服务器应用程序中添加对 IPv6 的支持 - sin6_flowinfo 和 sin6_scope_id 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8256671/

相关文章:

python - 为什么在 C 和 Python 中使用 OpenSSL API 时会得到不同的签名?

c - 我如何从二维数组中获取每列的总和并将其保存到 C 中的一维数组

javascript - 如何在 Angular 2/4+ 和 Socket.io 中关闭 websocket

go - 如何模拟客户端和服务器之间的完全网络丢失?

仅使用 MAC 地址在两个系统之间进行通信

c - 如何在 C 中将 stdin 的值存储到数组中?

c - fork 后 exec 系统调用中的调度策略

c - 如何将数据从UDP Server 发送到NAT 后面的UDP client?

c++ - unix 套接字与共享内存消息哪个更快

networking - 为什么我们可以使用 IDM 更快地下载