在Linux進行網路程式開發時,掌握核心結構體的定義與用途是基礎。本文整理了sys/socket.h、netinet/in.h、netdb.h中最常用的結構體,並說明其關鍵欄位與典型使用場景。
struct in_addr {
in_addr_t s_addr; // 32位IPv4位址,網路位元組序
};
s_addr儲存32位IPv4位址,通常透過inet_pton()或inet_addr()轉換字串與二進位格式。
struct sockaddr {
sa_family_t sa_family; // 位址族,如AF_INET、AF_INET6
char sa_data[14]; // 協定位址資料(不透明)
};
所有Socket API均以struct sockaddr*為參數型別,實際傳遞時需轉型為具體結構體指標。
struct sockaddr_in {
sa_family_t sin_family; // AF_INET
in_port_t sin_port; // 16位埠號,網路位元組序
struct in_addr sin_addr; // IPv4位址
unsigned char sin_zero[8]; // 填充,使大小與sockaddr一致
};
最常用的結構體。sin_port需用htons()轉換,sin_addr.s_addr用inet_pton()填充。sin_zero通常memset歸零。
struct hostent {
char *h_name; // 官方主機名
char **h_aliases; // 別名陣列,以NULL結尾
int h_addrtype; // 位址類型,AF_INET
int h_length; // 位址長度(位元組)
char **h_addr_list; // 位址指標陣列,以NULL結尾
};
#define h_addr h_addr_list[0] // 相容宏,取第一個位址
gethostbyname()、gethostbyaddr()回傳此結構。現代程式建議改用getaddrinfo(),支援IPv6且執行緒安全。
htons()/htonl()轉換。memcpy傳輸。struct in6_addr、struct sockaddr_in6,欄位命名規則類似。熟悉這些結構體是編寫高效、可移植網路程式的第一步。