zoukankan      html  css  js  c++  java
  • 网络编程之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 基于数据报提供伪流包。

  • 相关阅读:
    ExtJS小技巧
    Oracle 表的行数、表占用空间大小,列的非空行数、列占用空间大小 查询
    NPM 私服
    IDEA 不编译java以外的文件
    SQL 引号中的问号在PrepareStatement 中不被看作是占位符
    Chrome 浏览器自动填表呈现淡黄色解决
    批量删除Maven 仓库未下载成功.lastupdate 的文件
    Oracle 11g 监听很慢,由于监听日志文件太大引起的问题(Windows 下)
    Hibernate 自动更新表出错 建表或添加列,提示标识符无效
    Hibernate 自动更新表出错 More than one table found in namespace
  • 原文地址:https://www.cnblogs.com/likui360/p/6128938.html
Copyright © 2011-2022 走看看