我正在努力为多个应用程序实现IPv6支持,但是我想知道这两个字段的用途。这里关于这个的问题很少,所以我不确定我是否正确。
sin6_scope_id
)-好吧,Q1,Q2,Q3和Q4给了我关于范围ID的想法,我想我明白了。因此,我必须再添加一个config参数,以使scope-id可配置。 (如果有人对此感兴趣,我决定在此处添加它)。简短地说-范围ID是唯一确定应该处理流量的设备的必要条件-因为可能存在多个接口,它们具有相同的IP,但具有不同的(接口?)ID。到目前为止,一切都很好。sin6_flowinfo
)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 Specification,IETF draft: Flow Label as Transport-Layer Nonce,Practical guide for solaris和wikipedia。该字段不是过时的(或者我找不到这种来源,证实了这一点),但是看起来好像0
,因为值足够好。
最好的方法是使用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。
一个非常老的问题。由于很多人会无意间遇到这个问题并进入这篇文章(就像我一样),所以您现在可以在2019年找到一些好的文档。
如struct addrinfo
's ai_addr
中所述,
sin6_flowinfo
此字段包含两条信息:交通类别和流标签。
当前,不支持此字段,应将其设置为零以与更高版本兼容。