網絡編程之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 基於數據報提供偽流包。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM