网络编程之addrinfo

本文详细解析了addrinfo结构体的各个字段含义,包括ai_flags、ai_family、ai_socktype等,以及其在socket编程中的应用。同时介绍了与之相关的sockaddr和sockaddr_in结构体,阐述了它们在套接字地址解析中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;//指向链表中下一个结构的指针。
} 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:

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: 协议类型。

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_socktype: 套接字类

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 基于数据报提供伪流包。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值