网络编程之addrinfo

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[14];
};
struct sockaddr_in {
short           sin_family; //指代协议族,在socket编程中只能是 AF_INET
u_short         sin_port;   //存储端口号(使用网络字节顺序)
struct in_addr  sin_addr;   //存储IP地址,使用in_addr这个数据结构
char            sin_zero[8];//为了让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 基于数据报提供伪流包。

时间: 2024-08-05 09:47:49

网络编程之addrinfo的相关文章

linux网络编程之shutdown() 与 close()函数详解

linux网络编程之shutdown() 与 close()函数详解 参考TCPIP网络编程和UNP: shutdown函数不能关闭套接字,只能关闭输入和输出流,然后发送EOF,假设套接字为A,那么这个函数会关闭所有和A相关的套接字,包括复制的:而close能直接关闭套接字. 1.close()函数 [cpp] view plain copy print? <span style="font-size:13px;">#include<unistd.h> int 

java网络编程之UDP实例

package Socket; import java.net.DatagramPacket; import java.net.InetAddress; public class Dgram { public static DatagramPacket toDatagram(String s, InetAddress destIA, int destPort) { byte[] buf = new byte[s.length() + 1]; s.getBytes(0, s.length(), b

java网络编程之TCP实例

Dgram类 package Socket; import java.net.DatagramPacket; import java.net.InetAddress; public class Dgram { public static DatagramPacket toDatagram(String s, InetAddress destIA, int destPort) { byte[] buf = new byte[s.length() + 1]; s.getBytes(0, s.leng

扯谈网络编程之Tcp SYN flood洪水攻击

简介 TCP协议要经过三次握手才能建立连接: (from wiki) 于是出现了对于握手过程进行的攻击.攻击者发送大量的FIN包,服务器回应(SYN+ACK)包,但是攻击者不回应ACK包,这样的话,服务器不知道(SYN+ACK)是否发送成功,默认情况下会重试5次(tcp_syn_retries).这样的话,对于服务器的内存,带宽都有很大的消耗.攻击者如果处于公网,可以伪造IP的话,对于服务器就很难根据IP来判断攻击者,给防护带来很大的困难. 攻与防 攻击者角度 从攻击者的角度来看,有两个地方可以

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

12.2 网络编程之HttpClient类 除了可以使用HttpWebRequest类来实现HTTP网络请求之外,我们还可以使用HttpClient类来实现.对于基本的请求操作,HttpClient类提供了一个简单的接口来处理最常见的任务,并为身份验证提供了适用于大多数方案的合理的默认设置.对于较为复杂的 HTTP 操作,更多的功能包括:执行常见操作(DELETE.GET.PUT 和 POST)的方法:获取.设置和删除 Cookie 的功能:支持常见的身份验证设置和模式:异步方法上提供的 HTT

黑马程序员——Java网络编程之UDP传输

网络编程 网络模型 通讯要素:InetAddress(对象):ip地址,网络中设备的标识,不可记忆,可用主机名,本地回环地址:127.0.0.1主机名localhost 端口号 传输协议:UDP,将数据的源及目的封装成数据包中,不需要建立连接,每个数据包的大小限制在64K内,无连接,是不可靠协议,不需要建立连接,速度快.力求速度,不求数据的准确性.比如聊天软件,网络会议. TCP:建立连接,形成传输数据的通道,在连接中进行大数据量传输,通过三次握手完成连接,是可靠协议,必须建立连接效率稍低. S

linux网络编程之TCP/IP基础篇(一)

从今天起,将会接触到网络编程,平台是linux,实现语言C语言,最后将会实现一个简易的miniftp服务器. 主要的内容安排为:linux网络编程之TCP/IP基础篇,SOCKET编程篇,进程间通信篇,线程篇,实战ftp篇. 1.ISO/OSI参考模型:open system interconnection开放系统互联模型是由OSI(international organization for standardization )国际标准化组织定义的网络分层模型,共七层. 各层的具体含义: 物理层

【转】JAVA网络编程之Socket用法

JAVA网络编程之Socket用法 分类: JAVA2012-08-24 15:56 710人阅读 评论(0) 收藏 举报 在客户/服务器通信模式中,客户端需要主动建立与服务器连接的Socket,服务器端收到客户端的连接请求,也会创建与客户端连接的Socket.Socket可以看做是通信连接两端的收发器,客户端和服务店都通过Socket来收发数据. 1.构造Socket public Socket() 通过系统默认类型的 SocketImpl 创建未连接套接字 public Socket(Str

黑马程序员——网络编程之CTP传输

TCP传输 Socket和ServerSocket,实现了两台机器间的套接字端点,绑定本机IP地址.建立客户端和服务端,客户端对应的对象是Socket,服务端对应的对象是ServerSocket. //客户端部分 public class ClientA { private String filePath ; public String getFilePath() {return filePath;} public void setFilePath(String filePath ) { thi