Linux下网络相关结构体 struct addrinfo

来源:互联网 发布:园林设计做题软件 编辑:程序博客网 时间:2024/06/06 13:18

参考书籍:《UNIX环境高级编程》
参考连接:
http://www.cnblogs.com/benxintuzi/p/4589819.html

一、简介
结构体定义如下:

struct addrinfo{  int ai_flags;                 /* Input flags.  */  int ai_family;                /* Protocol family for socket.  */  int ai_socktype;              /* Socket type.  */  int ai_protocol;              /* Protocol for socket.  */  socklen_t ai_addrlen;         /* Length of socket address.  */  struct sockaddr *ai_addr;     /* Socket address for socket.  */  char *ai_canonname;           /* Canonical name for service location.  */  struct addrinfo *ai_next;     /* Pointer to next in list.  */};

1.ai_flags
用来指定如何处理地址和名字,可取得值如下:
这里写图片描述

2.ai_family
地址族,可取的值有AF_INET(IPv4) AF_INET6(IPv6) AF_UNIX(UNIX域) AF_UNSPEC(未指定)
如下:
这里写图片描述

3.ai_socktype
socket的类型,主要有SOCK_STREA(流)M和SOCK_DGRAM(数据报)两种,其它可选如下:
这里写图片描述

4.ai_protocol
socket协议,参数如下:

- IPPROTO_IP 0 IP协议 IPPROTO_IPV4 4 IPv4 IPPROTO_IPV6 41 IPv6 IPPROTO_TCP 6 TCP IPPROTO_UDP 17 UDP

在《UNIX环境高级编程》中,可以使用hint来过滤上面的结构体,仅使用ai_family、ai_flags、ai_protocol和ai_socktype字段,剩余的整数字段必须设置为零,并且指针字段为空。

二、代码展示
1)相关函数

int getaddrinfo(const char *node, const char *service,                const struct addrinfo *hints, struct addrinfo **res);void freeaddrinfo(struct addrinfo *res);const char *gai_strerror(int errcode);int getnameinfo(const struct sockaddr *sa, socklen_t salen,                char *host, size_t hostlen,                char *serv, size_t servlen, int flags);

2)getaddrinfo
此函数主要用来替代gethostbyname函数
1.代码

#include <stdlib.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>#include <string.h>#include <stdio.h>int main(int argc, char **argv){    int ret = -1;    struct addrinfo *res;    struct addrinfo hint;    struct addrinfo *curr;    char ipstr[16];       if (argc != 2) {        printf("parameter error\n");        return -1;    }    bzero(&hint, sizeof(hint));    hint.ai_family = AF_INET;    hint.ai_socktype = SOCK_STREAM;    ret = getaddrinfo(argv[1], NULL, &hint, &res);    if (ret != 0)     {        printf("getaddrinfo error\n");        return -1;    }    for (curr = res; curr != NULL; curr = curr->ai_next)     {        inet_ntop(AF_INET,&(((struct sockaddr_in *)(curr->ai_addr))->sin_addr), ipstr, 16);        printf("%s\n", ipstr);    }    freeaddrinfo(res);    return 0;}

2.运行

$ ./test www.baidu.com14.215.177.3814.215.177.39