getaddrinfo()函数和 addrinfo结构体 使用笔记

addrinfo结构体原型:

typedef struct addrinfo {
    int ai_flags;        //AI_PASSIVE,AI_CANONNAME,AI_NUMERICHOST
    int ai_family;        //AF_INET,AF_INET6
    int ai_socktype;    //SOCK_STREAM,SOCK_DGRAM
    int ai_protocol;    //IPPROTO_IP, IPPROTO_IPV4, IPPROTO_IPV6 etc.
    size_t ai_addrlen;            //must be zero or a null pointer
    char* ai_canonname;            //must be zero or a null pointer
    struct sockaddr* ai_addr;    //must be zero or a null pointer
    struct addrinfo* ai_next;    //must be zero or a null pointer
}

getaddrinfo()函数原型:

#include<netdb.h> (POSIX规范)
int getaddrinfo( const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo **result );

hostname:主机名或ipv4的点分十进制串或ipv6的十六进制串;

service:服务名,也可以理解为端口号,比如DNS服务,端口为53,FTP服务端口为21,也可以自己定义端口号,比如1534;

hints:可以是NULL,也可以是指向addrinfo结构体的指针,那么调用者需要往此结构中填充期望返回信息类型的暗示,比如hints.ai_protocol =  NULL,则返回的ai_protocol值或为IPPROTO_UDP或为IPPROTO_TCP;再如,如果服务器清楚自己只处理一种类型的套接字,则把hints中的ai_sockettype设置为流式套接字(SOCK_STRESAM)或数据报式套接字(SOCK_DGRAM),避免返回多个结构,故此成员起到过滤的作用;

result:返回符合hints条件的、指向addrinfo结构体链表的指针。

典型的服务器进程只指定service而不指定hostname,同时,指定AI_PASSIVE标志,则返回套接字地址结构中应含有一个INADDR_ANY(对于IPv4)或IN6ADDR_ANY(对于IPv6)的IP地址

 struct addrinfo hints;

hints.ai_family = PF_INET;
hints.ai_socktype = SOCK_DGRAM; //返回的服务既支持udp又支持tcp
hints.ai_protocol = IPPROTO_UDP;
hints.ai_flags = AI_PASSIVE;

getaddrinfo(NULL, 1534, &hints, &reslist);

for (res = reslist; res != NULL; res = res->ai_next)  {
        sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
        if (bind(sock, res->ai_addr, res->ai_addrlen)) { //返回值:成功返回0,失败返回-1.
           /*do something*/
        }

       /* listen();  recvfrom();*/ 

 }

设置ai_flag = AI_CANONNAME;

设置ai_family = AF_INET; 下图为返回的信息。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值