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) sockaddrUnix 作業系統格式(AF_UNIX)。

(2) sockaddr_inInternet 網路格式(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_UNIXUnix 作業系統)、AF_INETInternet 網路)、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 位址。

 

 

<GOTOP>