2013-12-18 30 views
8

Tôi mới tham gia lập trình mạng. Các định nghĩa cấu trúc sau đây khá khó hiểu với tôi. Ở đây h_addr_list là một mảng được định nghĩa là chuỗi, nhưng nó được sử dụng để lưu trữ mảng của các cấu trúc in_addr. Tại sao nó không xác định là struct in_addr **h_addr_list thay vì char **h_addr_list?Tại sao h_addr_list trong struct hostent một char ** thay vì struct in_addr **?

struct hostent 
{ 
    char *h_name;  /* Official domain name of host */ 
    char **h_aliases; /* Null-terminated array of domain names */ 
    int h_addrtype;  /* Host address type (AF_INET) */ 
    int h_length;  /* Length of an address, in bytes */ 
    char **h_addr_list;  /* Null-terminated array of in_addr structs */ 
}; 


struct in_addr 
{ 
    unsigned int s_addr; /* Network byte order (big-endian) */ 
}; 

Trả lời

11

Định nghĩa cấu trúc ngày trở lại thời đại trước khi C hỗ trợ void * (hoặc void ở tất cả hoặc nguyên mẫu). Trong những ngày đó, char * là 'con trỏ phổ quát'. Điều này giải thích cho một số điểm kỳ lạ của các giao diện chức năng mạng.

Nó cũng có từ thời đại khi có nhiều hệ thống mạng khác nhau (IPX/SPX, SNA, TCP/IP, ...). Những ngày này, TCP/IP chiếm ưu thế, nhưng ngay cả bây giờ, bạn có thể có một mảng IPv4 hoặc một mảng địa chỉ IPv6 đang được trả lại, do đó việc chỉ định struct in_addr hoặc struct in6_addr sẽ gây ra sự cố.

Mục đích là bạn có một chuỗi con trỏ cho các loại cấu trúc thích hợp. Ngày nay, nó sẽ được viết void **h_addr_list - một mảng của void *. Nhưng tùy chọn này không có sẵn khi cấu trúc được định nghĩa lần đầu tiên và phần còn lại là lịch sử (bạn không thay đổi giao diện sau khi nó được chuẩn hóa nếu bạn có thể tránh nó).

2

Khi cấu trúc được tạo, người tạo không chắc chắn liệu AF_INET có phải là loại địa chỉ chiến thắng hay không.

Điều gì sẽ xảy ra nếu h_addrtype có gì khác ngoài AF_INET? Sau đó, h_addr_list sẽ chứa các địa chỉ không phải là struct in_addr.

Bây giờ, một vài thập kỷ sau, chúng tôi thấy rằng địa chỉ IPV4 đang hết. Ngay sau đó, struct inaddr sẽ được thay thế ngày càng nhiều bởi địa chỉ IPV6.

Các vấn đề liên quan