概述
参考书籍:《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 errorn");
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 errorn");
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("%sn", ipstr);
}
freeaddrinfo(res);
return 0;
}
2.运行
$ ./test www.baidu.com
14.215.177.38
14.215.177.39
最后
以上就是儒雅牛排为你收集整理的Linux下网络相关结构体 struct addrinfo的全部内容,希望文章能够帮你解决Linux下网络相关结构体 struct addrinfo所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复