簡體   English   中英

struct addrinfo和struct sockaddr有什么區別

[英]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 addrinfogetaddrinfo()返回,並且在成功時包含指定主機名和/或服務的此類struct的鏈接列表。

ai_addr成員實際上不是struct sockaddr ,因為該struct只是一個包含所有其他struct的通用成員的通用struct ,用於確定實際擁有的結構類型。 根據您傳遞給getaddrinfo()以及該函數發現的內容, ai_addr實際上可能是指向struct sockaddr_instruct sockaddr_in6或其他任何內容的指針,具體取決於適合該特定地址條目的內容。 這是為什么它們保持“分離”的一個很好的理由,因為該成員可能指向一堆不同類型的struct的一個,如果你試圖將所有成員硬編碼到struct addrinfo ,它就無法做到,因為那些不同的struct有不同的成員。

如果您有主機名,這可能是獲取此信息的最簡單方法,但這不是唯一的方法。 對於IPv4連接,您可以自己填充struct sockaddr_in結構,如果您願意並且您有數據要這樣做,並且避免經歷調用getaddrinfo()的嚴格要求,如果需要,您可能需要等待它進入互聯網為您收集信息。 您根本不必使用struct addrinfo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM