addrinfo 结构
typedef struct addrinfo {
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
size_t ai_addrlen;
char *ai_canonname;
struct sockaddr *ai_addr;
struct addrinfo *ai_next;
} ADDRINFOA, *PADDRINFOA;
ai_addrlen: 指向的缓冲区的长度(以字节为单位)。
ai_canonname: 主机的规范名称。
ai_addr: 指向 sockaddr 结构的指针。每个返回的addrinfo结构中的ai_addr成员指向一个填充的套接字地址结构。
每个返回的addrinfo结构的长度(以字节为单位)在ai_addrlen成员中指定。
struct sockaddr { |
struct sockaddr_in { |
ai_next: 指向链表中下一个结构的指针。此参数在链接列表的最后一个addrinfo结构中设置为NULL。
ai_flags: 指示在getaddrinfo函数中使用的选项的标志。
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 结构的更多相关文章
- addrinfo结构体原型-(转自 cxz2009)
addrinfo结构体原型 typedef struct addrinfo { int ai_flags; //AI_PASSIVE,AI_CANONNAME,AI_NUMERIC ...
- 结构体addrinfo, sockaddr, sockaddr_in的区别
struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址. 一.sockaddr sockaddr在头文件#include <sys/socket. ...
- 网络编程之addrinfo
addrinfo结构体定义如下: typedef struct addrinfo { int ai_flags;//指示在getaddrinfo函数中使用的选项的标志. int ai_family; ...
- socket编程相关的结构体和字节序转换、IP、PORT转换函数
注意:结构体之间不能直接进行强制转换, 必须先转换成指针类型才可以进行结构体间的类型转换, 这里需要明确的定义就是什么才叫强制转换. 强制转换是将内存中一段代码以另一种不同类型的方式进行解读, 因此转 ...
- 网络编程之getaddrinfo
IPv4中使用gethostbyname()函数完成主机名到地址解析,但是该API不允许调用者指定所需地址类型的任何信息,返回的结构只包含 了用于存储IPv4地址的空间.为了解决该问题,IPv6中引入 ...
- [16]APUE:套接字
[a] socket / socketpair #include <sys/socket.h> int socket(int domain, int type, int protocol) ...
- getaddrinfo function
The getaddrinfo function provides protocol-independent translation from an ANSI host name to an addr ...
- getaddrinfo
gethostbyname和gethostbyaddr这两个函数仅仅支持IPv4,getaddrinfo函数能够处理名字到地址以及服务到端口这两 种转换,返回的是一个sockaddr结构的链表而不是一 ...
- glibc resolv/res_send.c getaddrinfo() buffer stack smash when dealing malformation big DNS Response Package
catalogue . 漏洞简述 . 调试环境搭建 . 漏洞利用 . 漏洞分析 . 缓解修复方案 1. 漏洞简述 0x1: 函数调用顺序 getaddrinfo (getaddrinfo.c) -&g ...
随机推荐
- Java--如何使用sun.misc.Unsafe完成compareAndSwapObject原子操作
package com; import sun.misc.Unsafe; import java.lang.reflect.Field; /** * Created by yangyu on 16/1 ...
- ahjesus使用T4模板自动维护实体
在entity项目里新建模板DBEntity.tt <#@ template debug="false" hostspecific="true" lang ...
- PHP curl超时问题
今天调试一个非常老的代码时 发现nginx服务器超时 改了下nginx配置 发现是后台脚本一直等待 排查到最后发现是curl 超时引起的等待 具体解决方案: curl_setopt( $this ...
- 使用PhpStrom等IDE编辑 远程linux服务器上的文件 实时更新
习惯了在linux上 vim进行PHP的开发,突然忘了IDE的感觉,所以想到了.通过PhpStrom等IDE直接编辑 samba共享到 mac或者windows本地的磁盘进行编辑. 为了忘却的纪念,有 ...
- JavaScript对象(Object)
JavaScript的简单数据类型包括数字.字符串.布尔值.null值和undefined值,其他所有的值都是对象.数字.字符串.布尔值“貌似”对象,因为他们拥有方法,但是他们是不可变的. ...
- C#语言的基础
一.C#的引入 01..net和C#的区别 1)大概在2000年,微软推出了一种革命性的产品--.NET(战略) 目标:任何人,在任何地方,使用任何终端设备,都可以访问微软提供的服务. 2).net ...
- 使用 WordPress 插件模板开发高质量插件
WordPress 插件样板是标准化的,有组织的,面向对象的基础,用于构建高品质的 WordPress 插件.样板遵循编码标准和文件标准,所以你不必自己学习这些,根据注释编写代码即可. 官方网站 ...
- 20个最新的照片 PS 技巧,提升摄影水平
相信很多人都知道 Photoshop 在照片编辑方面的强大,所以几乎每张照片经过 PS 处理后都可以变成一个真正的杰作.这里分享的这组 Photoshop 教程可以帮助你学习到新的照片处理技术.你会发 ...
- 【HTML5】浅析HTML5应用程序缓存(ApplicationCache)
一.为什么需要Web应用程序缓存 在移动互联网时代,设备终端位置不再固定,依赖无线信号,网络的可靠性变得降低,比如坐在火车上,过了一个隧道(15分钟),便无法访问网站,这对于web的伤害是很大的 ...
- 用TypeScript开发了一个网页游戏引擎,开放源代码
最开始学习电脑编程的原动力之一就是想自己编写游戏,一方面很好奇这些游戏是怎么做出来的,另一方面觉得有些地方设计的不合理,希望电脑游戏既能让人玩的有趣,又不浪费时间. 学校五年,毕业十年,学用了十多种编 ...