加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

ip6编程

发布时间:2020-12-14 05:13:59 所属栏目:大数据 来源:网络整理
导读:1,使用 getaddrinfo 来 bind 或 connect bind 和 connect 有了一种新方式,通过 getaddrinfo 返回适合 bind 和 connect 的地址,然后,通过遍历列表,直到 bind 或 connect 成功,结束遍历(参见 getaddrinfo说明中的例子)。 getaddrinfo 可以返回 ip4 和
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,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,port,NI_MAXSERV,NI_NUMERICHOST|NI_NUMERICSERV);

3,ip4 和 ip6 的公共储存结构体 sockaddr_storage获取 ip 地址信息时,可以先定义个 这种类型的变量储存,支持 ip4 和 ip6,再通过 getnameinfo 来获取 host 和 port

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读