[英]What is the difference between struct addrinfo and struct sockaddr
根據我的理解,struct addrinfo用於准備套接字地址結構,struct sockaddr包含套接字地址信息。 但這究竟意味着什么呢? struct addrinfo包含指向struct sockaddr的指針。 為什么要將它們分開? 為什么我們不能將sockaddr中的所有內容組合到addr_info中?
我只是在這里猜測,但他們分離的原因是為了在傳遞結構時節省空間? 例如,在bind()調用中,它需要的只是端口號和Internet地址。 所以這兩個都分組在struct sockaddr中。 那么,我們可以傳遞這個小結構而不是更大的結構addrinfo?
struct addrinfo {
int ai_flags; // AI_PASSIVE, AI_CANONNAME, etc.
int ai_family; // AF_INET, AF_INET6, AF_UNSPEC
int ai_socktype; // SOCK_STREAM, SOCK_DGRAM
int ai_protocol; // use 0 for "any"
size_t ai_addrlen; // size of ai_addr in bytes
struct sockaddr *ai_addr; // struct sockaddr_in or _in6
char *ai_canonname; // full canonical hostname
struct addrinfo *ai_next; // linked list, next node
};
struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol address
};
struct addrinfo
由getaddrinfo()
返回,並且在成功時包含指定主機名和/或服務的此類struct
的鏈接列表。
ai_addr
成員實際上不是struct sockaddr
,因為該struct
只是一個包含所有其他struct
的通用成員的通用struct
,用於確定實際擁有的結構類型。 根據您傳遞給getaddrinfo()
以及該函數發現的內容, ai_addr
實際上可能是指向struct sockaddr_in
或struct sockaddr_in6
或其他任何內容的指針,具體取決於適合該特定地址條目的內容。 這是為什么它們保持“分離”的一個很好的理由,因為該成員可能指向一堆不同類型的struct
的一個,如果你試圖將所有成員硬編碼到struct addrinfo
,它就無法做到,因為那些不同的struct
有不同的成員。
如果您有主機名,這可能是獲取此信息的最簡單方法,但這不是唯一的方法。 對於IPv4連接,您可以自己填充struct sockaddr_in
結構,如果您願意並且您有數據要這樣做,並且避免經歷調用getaddrinfo()
的嚴格要求,如果需要,您可能需要等待它進入互聯網為您收集信息。 您根本不必使用struct addrinfo
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.