Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux網路程式設計核心結構體詳解

編輯:Linux 教學

在Linux進行網路程式開發時,掌握核心結構體的定義與用途是基礎。本文整理了sys/socket.h、netinet/in.h、netdb.h中最常用的結構體,並說明其關鍵欄位與典型使用場景。

IPv4位址結構

struct in_addr {
    in_addr_t s_addr;  // 32位IPv4位址,網路位元組序
};

s_addr儲存32位IPv4位址,通常透過inet_pton()或inet_addr()轉換字串與二進位格式。

通用Socket位址

struct sockaddr {
    sa_family_t sa_family;  // 位址族,如AF_INET、AF_INET6
    char        sa_data[14]; // 協定位址資料(不透明)
};

所有Socket API均以struct sockaddr*為參數型別,實際傳遞時需轉型為具體結構體指標。

IPv4 Socket位址

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且執行緒安全。

實務提醒

  • 所有網路位元組序欄位(埠號、IP位址)必須用htons()/htonl()轉換。
  • 結構體大小與對齊在不同架構可能不同,切勿直接memcpy傳輸。
  • IPv6對應結構體為struct in6_addr、struct sockaddr_in6,欄位命名規則類似。

熟悉這些結構體是編寫高效、可移植網路程式的第一步。

Copyright © Windows教程網 All Rights Reserved