Kir*_*rov 23 c sockets network-programming ipv6
我致力于为多个应用程序实现IPv6支持,但我想知道这两个字段是什么.关于这一点的问题很少,所以我不确定我做对了.
sin6_scope_id) - 好吧,Q1,Q2,Q3和Q4给了我关于范围ID的想法,我想我明白了.所以,我将不得不再添加一个配置参数,以使scope-id可配置.(我决定在这里添加,以防有人对此感兴趣).短时间 - 范围ID是唯一确定哪个设备应该处理流量所必需的 - 因为可能有多个接口,具有相同的IP,但具有不同的(接口?)ID.到现在为止还挺好.sin6_flowinfo)
sin6_flowinfo(比如 - 几个值,如标志,这意味着什么),或者它就像sin6_scope_id- 可能是任何值,取决于设备,我正在尝试连接?0(就像在Beej的网络编程指南中一样.是的,我尝试过,它有效,但我不确定它是否只适用于这种情况(如果它取决于它)在某些网络配置上),或者如果设置为0?它将始终有效?google-ing"sin6_flowinfo"给出了结构定义和手册页,对这个领域没什么用处.任何有趣的来源?(可理解的一个......不是RFC:D)编辑:嗯,在@glglgl的回答和提示之后,这sin6_flowinfo可能已经过时了,我发现了一些有趣的资料来源: RFC:IPv6流标签规范, IETF草案:流标签作为传输层Nonce, solaris和维基百科的实用指南.
该字段不是过时的(或者我找不到这样的来源,这证实了这一点),但看起来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);
Run Code Online (Sandbox Code Playgroud)
这会让你担心sin6_scope_id; 这通常是0,除非你有链接本地地址,如fe80::1234:56ff:fe78:9abc%eth2.这eth2将转换为正确的范围ID.
sin6_flowinfo是过时(AFAIK),从而设置为0在所得struct addrinfo的ai_addr.