ip6编程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ip6编程相关的知识,希望对你有一定的参考价值。
1,使用 getaddrinfo 来 bind 或 connect
bind 和 connect 有了一种新方式,通过 getaddrinfo 返回适合 bind 和 connect 的地址,然后,通过遍历列表,直到 bind 或 connect 成功,结束遍历(参见 getaddrinfo说明中的例子)。
getaddrinfo 可以返回 ip4 和 ip6 地址。
这样避免了直接通过构造 sockaddr_in 或 sockaddr_in6 并与 sockaddr强制转换,也不用关心 ip 类型了。
struct addrinfo hints;
struct addrinfo *result = NULL, *rp = NULL;
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */
hints.ai_socktype = SOCK_STREAM; /* Datagram socket */
hints.ai_flags = AI_ADDRCONFIG;
//hints.ai_protocol = 0; /* Any protocol */
hints.ai_protocol = IPPROTO_TCP;
hints.ai_canonname = NULL;
hints.ai_addr = NULL;
hints.ai_next = NULL;
hints.ai_flags 取值 | 第一个参数的取值 | 返回列表的包含值 |
---|---|---|
包含AI_PASSIVE | NULL | INADDR_ANY和IN6ADDR_ANY_INIT,即 0.0.0.0 和 ::: |
包含AI_PASSIVE | 192.168.1.1 | 192.168.1.1 |
不包含AI_PASSIVE | 192.168.1.1 | 192.168.1.1 |
不包含AI_PASSIVE | 127.0.0.1 | 127.0.0.1 |
不包含AI_PASSIVE | 0.0.0.0 | 0.0.0.0 |
当第一个参数不为NULL时,忽略AI_PASSIVE
当第一个参数不为NULL时,返回的是一个适合 connect,sendto,sendmsg的地址
总结:
根据hints的初始化,来获取一个server端或client端的地址而不用关心ip类型。
2,通过 addrinfo 获取 host 及 port
char host[NI_MAXHOST] = {0};
char port[NI_MAXSERV] = {0}; getnameinfo(hints.ai_addr,NI_MAXHOST,host,NI_MAXHOST,port,NI_MAXSERV,NI_NUMERICHOST|NI_NUMERICSERV);
3,ip4 和 ip6 的公共储存结构体 sockaddr_storage
获取 ip 地址信息时,可以先定义个 这种类型的变量储存,支持 ip4 和 ip6,再通过 getnameinfo 来获取 host 和 port
以上是关于ip6编程的主要内容,如果未能解决你的问题,请参考以下文章