TCP/IP 協定與 Internet 網路:第八章 TCP Socket 程式介面 上一頁 下一頁
8-4 Socket 傳輸位址
早期 BSD 制定 Socket 介面時,希望 Socket 能連結到不同的傳輸提供者(Transport Provider),但各種傳輸提供者都有其特殊的定址方式,因此,Socket 必須提供一個標準的傳輸位址模式來轉換不同的位址格式。首先我們來探討傳輸位址必須具有哪些內容,一般當我們用 Socket 程式庫時會有如下列步驟:
(1) 將 Socket 連結到一個傳輸位址。
(2) 連接到遠端 Socket。
(3) 傳輸資料。
此時 Socket 程式庫至少必須攜帶兩個參數:一者為連結到傳輸位址的指標;另一者為包含多少個緩衝器的資料。目前在許多 Unix/Linux 作業系統裡,為了能結合多種不同的傳輸提供者(也就是傳輸層),也包含許多傳輸位址格式,以下列出 Internet 網路較常使用的三種位址格式:
(1) sockaddr:Unix 作業系統格式(AF_UNIX)。
(2) sockaddr_in:Internet 網路格式(AF_INET)。
(3) sockaddr_un:本機迴授位址(Loopback)格式(AF_UNIX)
以下分別介紹之。
8-4-1 Unix 位址格式 - sockaddr
在 Unix/Linux 系統上,BSD 針對系統核心制定一個網路位址格式,它是以 16 位元之 Socket 位址來表示,又以 sockaddr 資料型態來表示 Socket 位址,其資料結構如下:
struct sockaddr { u_short sa_family; char sa_data[14]; } |
● sa_family:表示 Socket 的系列家族,為 sockaddr 的前面兩個位元組。
● sa_data[14]:表示所描述 Socket 位址的資料。在 BSD 核心系統的操作下,sa_data 包含路由表、介面位址,以及核心所描述特殊表格的資料。
8-4-2 Internet 位址格式 - sockaddr_in
針對 Internet 網路上傳輸,BSD 也制定一個 sockaddr_in 資料結構,來描述網路之間的位址格式,其資料結構如下:
struct sockaddr_in { u_short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; |
各欄位功能如下:
● sin_family:表示該 Socket 的通訊協定家族系列,可選擇:AF_UNIX(Unix 作業系統)、AF_INET(Internet 網路)、AF_NS 或 AF_IMPLINK 等。
● sin_port:表示該 Socket 所連接的埠口位址,如通訊家族為 AF_INET,則表示 TCP/UDP 埠口號碼。
● sin_addr:表示該 Socket 所連接之 IP 位址。對於 32 位元 IP 的表示方法有三種:(1) 用 4 位元組將 IP 位址分割為 4 個十進位之數字表示(如 163.15.2.62);(2) 區分為兩個群組表示(網路位址 + 主機位址);(3) 直接以一個數字表示。因此,用 in_addr 資料結構來宣告位址格式方式:
struct in_addr { union { struct { u_char s_b1, s_b2, s_b3, s_b4; } S_un_b; struct { u_short s_w1, s_w2; } S_un_w; u_long s_addr; } ; }; |
● sin_zero:目前未使用,一般都為 0。
8-4-3 Loopback 位址格式 - sockaddr_un
在 Unix/Linux 系統下,如果使用迴授介面(Loopback)開發 Socket 應用程式時,所使用的位址格式為 sockaddr_un,其定義如下:
struct sockaddr_un { u_short sun_family; char sun_path[108]; }; |
各欄位功能如下:
● sun_family:通訊協定家族。在這種情況下必須使用 AF_UNIX,而其值為 1。
● sun_path:路徑位址(Pathname)。在這裡為 Unix 的檔案名稱,如果該檔案存在,則這個位址被使用到,否則不被使用,而等待連結到 Socket 位址。