addrinfo结构体定义如下:

typedef struct addrinfo {
int        ai_flags;//指示在getaddrinfo函数中使用的选项的标志。
int         ai_family;
int        ai_socktype;
int         ai_protocol;
size_t        ai_addrlen;
char        *ai_canonname;
struct sockaddr   *ai_addr;
struct addrinfo   *ai_next;//指向链表中下一个结构的指针。此参数在链接列表的最后一个addrinfo结构中设置为NULL。
} ADDRINFOA, *PADDRINFOA;

其中:

ai_addrlen:           指向的缓冲区的长度(以字节为单位)。
ai_canonname:     主机的规范名称。
ai_addr:             指向 sockaddr 结构的指针。每个返回的addrinfo结构中的ai_addr成员指向一个填充的套接字地址结构。
                           每个返回的addrinfo结构的长度(以字节为单位)在ai_addrlen成员中指定。

两个结构体的内容:

struct sockaddr {
ushort sa_family;
char sa_data[];
};
struct sockaddr_in {
short sin_family; //指代协议族,在socket编程中只能是 AF_INET
u_short sin_port; //存储端口号(使用网络字节顺序)
struct in_addr sin_addr; //存储IP地址,使用in_addr这个数据结构
char sin_zero[];//为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
};

ai_flags:
Value Meaning
AI_PASSIVE 套接字地址将用于调用bind 函数
AI_CANONNAME 返回规范名称
AI_NUMERICHOST 传递给getaddrinfo函数的nodename参数必须是数字字符串。
AI_ALL If this bit is set, a request is made for IPv6 addresses and IPv4 addresses with AI_V4MAPPED.
AI_ADDRCONFIG 只有配置了全局地址后,getaddrinfo才会解析。 IPv6和IPv4环回地址不被认为是有效的全局地址。
AI_V4MAPPED 如果对IPv6地址的getaddrinfo请求失败,则对IPv4地址进行名称服务请求,这些地址将转换为IPv4映射IPv6地址格式。
AI_NON_AUTHORITATIVE 地址信息可以来自非授权命名空间提供商
AI_SECURE 地址信息来自安全信道。
AI_RETURN_PREFERRED_NAMES 地址信息是用于用户的优选名称。
AI_FQDN getaddrinfo将返回名称最终解析为的完全限定域名。 完全限定域名在ai_canonname成员中返回。
这与AI_CANONNAME位标记不同,后者返回在DNS中注册的规范名称,该名称可能与平面名称解析为的完全限定域名不同。
只能设置AI_FQDN和AI_CANONNAME位中的一个。 如果EAI_BADFLAGS同时存在这两个标志,getaddrinfo函数将失败。
AI_FILESERVER 命名空间提供程序提示正在查询的主机名正在文件共享方案中使用。 命名空间提供程序可以忽略此提示。

ai_family: The address family.

AF_UNSPEC 地址系列未指定。
AF_INET IPv4 address family.
AF_NETBIOS NetBIOS地址系列。
AF_INET6 IPv6 address family.
AF_IRDA The Infrared Data Association address family.
AF_BTH Bluetooth address family.

ai_protocol: 协议类型。

Value Meaning
IPPROTO_TCP 传输控制协议(TCP)。 当ai_family成员为AF_INET或AF_INET6且ai_socktype成员为SOCK_STREAM时,这是一个可能的值
IPPROTO_UDP 用户数据报协议(UDP)。 当ai_family成员为AF_INET或AF_INET6且类型参数为SOCK_DGRAM时,这是一个可能的值。
IPPROTO_RM PGM协议用于可靠的组播。 当ai_family成员为AF_INET且ai_socktype成员为SOCK_RDM时,这是一个可能的值。 在为Windows Vista及更高版本发布的Windows SDK上,此值也称为IPPROTO_PGM。
可能的选项特定于指定的地址系列和套接字类型。
如果为ai_protocol指定了值0,则调用者不希望指定协议,服务提供者将选择要使用的ai_protocol。 对于IPv4和IPv6之外的协议,将ai_protocol设置为零。
下表列出了ai_protocol成员的通用值,尽管其他许多值也是可能的。

ai_socktype:  套接字类型

Value Meaning
SOCK_STREAM 使用OOB数据传输机制提供顺序,可靠,双向,基于连接的字节流。使用Internet地址系列(AF_INET或AF_INET6)的传输控制协议(TCP)。如果ai_family成员是AF_IRDA,则SOCK_STREAM是唯一支持的套接字类型。
SOCK_DGRAM 支持数据报,它是无连接的,不可靠的固定(通常小)最大长度的缓冲区。对Internet地址系列(AF_INET或AF_INET6)使用用户数据报协议(UDP)。
SOCK_RAW 提供一个原始套接字,允许应用程序处理下一个上层协议头。要操作IPv4标头,必须在套接字上设置IP_HDRINCL套接字选项。要操作IPv6头,必须在套接字上设置IPV6_HDRINCL套接字选项。
SOCK_RDM 提供可靠的消息数据报。这种类型的示例是在Windows中的实用通用多播(PGM)多播协议实现,通常被称为可靠多播节目。
SOCK_SEQPACKET 基于数据报提供伪流包。

网络编程之addrinfo的更多相关文章

  1. 网络编程之socket

    网络编程之socket socket:在网络编程中的一个基本组件,也称套接字. 一个套接字就是socket模块中的socket类的一个实例. 套接字包括两个: 服务器套接字和客户机套接字 套接字的实例 ...

  2. [深入浅出WP8.1(Runtime)]网络编程之HttpClient类

    12.2 网络编程之HttpClient类 除了可以使用HttpWebRequest类来实现HTTP网络请求之外,我们还可以使用HttpClient类来实现.对于基本的请求操作,HttpClient类 ...

  3. java网络编程之TCP通讯

    java中的网络编程之TCP协议的详细介绍,以及如何使用,同时我在下面举2例说明如何搭配IO流进行操作, /* *TCP *建立连接,形成传输数据的通道: *在连接中进行大数据量传输: *通过三次握手 ...

  4. python3网络编程之socketserver

    本节主要是讲解python3网络编程之socketserver,在上一节中我们讲到了socket.由于socket无法支持多用户和多并发,于是就有了socket server. socket serv ...

  5. 网络编程之UDP编程

    网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了Data ...

  6. 网络编程之TCP编程

    网络编程之TCP编程 前面已经介绍过关于TCP协议的东西,这里不做赘述.Java对于基于TCP协议的网络通信提供了良好的封装,Java使用socket对象来代表两端的通信窗口,并通过Socket产生I ...

  7. 网络编程之socketserver

    网络编程之socketserver """ socketserver.py 中的5个基础类 +------------+ | BaseServer | +-------- ...

  8. 网络编程之Socket & ServerSocket

    网络编程之Socket & ServerSocket Socket:网络套接字,网络插座,建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP ...

  9. GO语言的进阶之路-网络编程之socket

    GO语言的进阶之路-网络编程之socket 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是socket; 在说socket之前,我们要对两个概念要有所了解,就是IP和端口 ...

随机推荐

  1. 第一次使用Linux服务器所栽之坑

    一直以来想拥有一个服务器,但是一直舍不得.9.21日终于心血来潮,买了一个腾讯云服务器.对比了一下腾讯云和阿里云,发现腾讯云比较良心,不仅有学生价1元/月,而且整体价格也比阿里云便宜.之前用过一次阿里 ...

  2. 动画的使用—Drawable Animation

    Drawable Animation可以称为帧动画,因为它是通过每次播放一帧Drawable资源实现的. Drawable Animation算不上真正意义上的动画,因为它的内部实现是通过定时发送消息 ...

  3. 构建自己的 Linux 发行版

    如何用 SUSE Studio 构建 Linux 发行版? (1) 进入到 www.susestudio.com,设立一个帐户 (2) 为你的设备(发行版)选择一个基本模板 -软件和软件包选择 (1) ...

  4. 特征检测(feature detection)的一些资料

    FAST特征点: http://blog.csdn.net/hujingshuang/article/details/46898007 BRIEF特征描述子: http://blog.csdn.net ...

  5. UEditor独立图片、文件上传模块

    百度的UEditor编辑器的强大之处不用多说,但是有时候我们只想用他的文件.图片上传模块,不想把这个编辑器加载出来,话不多说,直接上实现代码: 引用文件: <script src="~ ...

  6. js ie中实现拖拽

    获取鼠标移动信息 开始我们需要获取鼠标的坐标.我们添加一个document.onmousemove 就可以达到此目的: Javascript:   document.onmousemove = mou ...

  7. Apache 80无法启动

    netstat -abno后查看,经过查找为pid=4的system进程,因为是系统进程,也无法结束它,经查SQL Server ReportingServices (SQLEXPRESS) 服务占用 ...

  8. 【Codeforces718C】Sasha and Array 线段树 + 矩阵乘法

    C. Sasha and Array time limit per test:5 seconds memory limit per test:256 megabytes input:standard ...

  9. elastichq auto connect

    $(document).ready(function () { $('#connectionURL').focus(); ajaxloading.hide(); scrollToTop.activat ...

  10. 数据存储_ SQLite (1)

    一.SQL语句 如果要在程序运行过程中操作数据库中的数据,那得先学会使用SQL语句 1.什么是SQL SQL(structured query language):结构化查询语言 SQL 是一种对关系 ...