Từ những gì tôi hiểu struct addrinfo được sử dụng để chuẩn bị cấu trúc địa chỉ socket và struct sockaddr chứa thông tin địa chỉ socket. Nhưng điều đó thực sự có ý nghĩa gì? struct addrinfo chứa một con trỏ tới một struct sockaddr. Tại sao giữ chúng riêng biệt? Tại sao chúng ta không thể kết hợp tất cả mọi thứ trong sockaddr vào addr_info?Sự khác nhau giữa struct addrinfo và struct sockaddr
Tôi chỉ đoán ở đây nhưng lý do cho sự tách biệt của họ là tiết kiệm không gian khi đi qua các cấu trúc? Ví dụ trong lệnh bind(), tất cả những gì nó cần là số cổng và địa chỉ internet. Vì vậy, cả hai được nhóm trong một sockaddr struct. Vì vậy, chúng tôi chỉ có thể vượt qua cấu trúc nhỏ này thay vì addrinfo struct lớn hơn?
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
};
là getaddrinfo() cũng hữu ích hơn nếu bạn chỉ biết tên máy chủ chứ không phải địa chỉ IP của máy chủ? Bởi vì nó có vẻ lặp đi lặp lại nếu bạn là khách hàng (và bạn biết ip của máy chủ) và bạn gọi getaddrinfo và bạn gửi địa chỉ ip của máy chủ và getaddrinfo() trả về cấu trúc addrinfo với tất cả các chi tiết bạn đã biết? bình luận này chỉ cần nói lại những gì bạn nói .. xin lỗi – user68212
'getaddrinfo()' đôi khi thuận tiện nếu bạn có địa chỉ IP trong một chuỗi * * - nói sau khi nó được nhập vào dòng lệnh. Bạn có thể phân tích nó cho chính mình và đưa nó vào định dạng tích phân 32 bit theo yêu cầu của 'struct sockaddr_in', nhưng đôi khi bạn có thể thấy dễ dàng hơn để cho' getaddrinfo() 'làm điều đó cho bạn. Nếu bạn đã có IP trong một định dạng, bạn có thể thả vào 'struct sockaddr_in', gọi' getaddrinfo() 'thường sẽ là vô nghĩa. –