Linux 套接字的結構定義

Linux 在頭文件 sys/socket.h 中定義了一種通用的套接字結構類型,以供不同的協議進行調用。

struct sockaddr
{
    unsigned short int sa_family;//套接字協議地址類型
    unsigned char sa_data[14];//14字節的協議地址,包括IP地址和端口
};
  • sa family:套接字的協議族地址類型。
  • sa_data:具體的協議地址,不同的協議族對應不同的地址結構。

常見協議對應的 sa_family 值

可選值 說明
AF_INET IPv4協議
AF_INET6 IPv6協議
AF_LOCAL UNIX協議
AF_LINK 鏈路地址協議
AF_KEY 密鑰套接字

除了 sockaddr 之外,Linux 還在 netinet/in.h 中定義了另外一種結構類型 sockaddr_in,其和 sockaddr 等效且可以互相轉換,通常會在涉及 TCP/IP 的協議編程中使用。

struct sockaddr_in
{
    int sa_len;//長度單位
    short int sa_family;//地址族
    unsigned short int sin_port;//端口號
    struct in_addr sin_addr;//IP地址
    unsigned char sin_zero[8];//填充0以保持與struct sockaddr同樣大小
};
  • sa_len:長度單位,不必設置,通常情況下固定長度爲16字節。
  • sa_family:協議族。
  • sin_port:端口號。
  • sin_addr:IP地址, 其本身也是一個結構體,對該結構體的描述說明如下。
struct sin_addr
{
    in addr_t s_add; //32位IPv4地址,網絡字節順序
};
  • sin_zero:填充0,目的是爲了保持該結構和 sockaddr 結構同樣的大小,以方便轉換。

使用結構 sockaddr _in 時需注意以下幾點:

  • 結構 sockadd_in 中的 TCP 或 UDP 端口號 sin_port 和 IP 地址 sin_addr 都是以網絡字節順序存儲的。
  • 32位的 IP 地址可以利用兩種不同的方法引用,例如,假設定義變量 sevaddr 爲Internet 套接字的地址結構,那麼可以用 servaddr.sin_addr 或 servaddr.sin_addr.s_addr 來引用這個 IP 地址,需要注意的是前一種引用是結構類型(struct sin_addr)的數據,而後一種引用是整數類型的數據;當將 IP 地址作爲函數參數使用時,需要明確使用哪種類型的數據,因爲編譯器對結構類型參數和整數類型參數的處理方式不一樣。
  • sin_zero 成員未被使用,它是爲了和通用套接字地址(struct sockaddr)保持一致而引入的,通常會被填充爲 0。
  • 套接字地址結構僅供本機 TCP 協議記錄套接字信息而用,這個結構變量本身是不在網絡上傳輸的,但是其某些內容,如 IP 地址和端口號是在網絡上傳輸的,因此這兩部分數據需要轉換成網絡字節順序。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章