int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
Cấu trúc thực tế được chuyển cho đối số bổ sung sẽ phụ thuộc vào họ địa chỉ. Cấu trúc sockaddr được định nghĩa là một cái gì đó như:Mục đích của trường sa_data trong sockaddr là gì?
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
}
Vì vậy, đối với một địa chỉ IPv4 (AF_INET), các cấu trúc thực tế sẽ được thông qua là thế này:
/* Source http://linux.die.net/man/7/ip */
struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order */
struct in_addr sin_addr; /* internet address */
};
/* Internet address. */
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};
Liệu mã bind đọc giá trị sockaddr.sa_family
và tùy thuộc vào giá trị mà nó tìm thấy, sau đó nó sẽ đúc cấu trúc sockaddr
vào cấu trúc thích hợp như sockaddr_in
?
Tại sao sa_data
đặt thành 14 ký tự? Nếu tôi hiểu chính xác, trường sa_data
chỉ là một trường có dung lượng bộ nhớ đủ lớn để phù hợp với tất cả các loại gia đình địa chỉ? Có lẽ các nhà thiết kế ban đầu dự đoán rằng 14 ký tự sẽ đủ rộng để phù hợp với tất cả các loại trong tương lai.
https://en.wikipedia.org/wiki/Type_punning – user3386109