Unix套接字 - 結構



Unix套接字程式設計中使用了各種結構來儲存有關地址、埠和其他資訊的資訊。大多數套接字函式都需要一個指向套接字地址結構的指標作為引數。本章中定義的結構與網際網路協議族相關。

sockaddr

第一個結構是sockaddr,它儲存套接字資訊:

struct sockaddr {
   unsigned short   sa_family;
   char             sa_data[14];
};

這是一個通用的套接字地址結構,它將被傳遞到大多數套接字函式呼叫中。下表提供了成員欄位的描述:

屬性 描述
sa_family

AF_INET

AF_UNIX

AF_NS

AF_IMPLINK

它表示一個地址族。在大多數基於網際網路的應用程式中,我們使用AF_INET。
sa_data 協議特定的地址 14個位元組的協議特定地址的內容根據地址型別進行解釋。對於網際網路族,我們將使用埠號IP地址,它由下面定義的sockaddr_in結構表示。

sockaddr_in

第二個結構幫助你引用套接字的元素如下:

struct sockaddr_in {
   short int            sin_family;
   unsigned short int   sin_port;
   struct in_addr       sin_addr;
   unsigned char        sin_zero[8];
};

以下是成員欄位的描述:

屬性 描述
sa_family

AF_INET

AF_UNIX

AF_NS

AF_IMPLINK

它表示一個地址族。在大多數基於網際網路的應用程式中,我們使用AF_INET。
sin_port 服務埠 一個以網路位元組序表示的16位埠號。
sin_addr IP地址 一個以網路位元組序表示的32位IP地址。
sin_zero 未使用 只需將此值設定為NULL,因為它沒有被使用。

in_addr

此結構僅在上述結構中用作結構欄位,並儲存32位netid/hostid。

struct in_addr {
   unsigned long s_addr;
};

以下是成員欄位的描述:

屬性 描述
s_addr 服務埠 一個以網路位元組序表示的32位IP地址。

hostent

此結構用於儲存與主機相關的資訊。

struct hostent {
   char *h_name; 
   char **h_aliases; 
   int h_addrtype;  
   int h_length;    
   char **h_addr_list
	
#define h_addr  h_addr_list[0]
};

以下是成員欄位的描述:

屬性 描述
h_name ti.com 等 它是主機的正式名稱。例如,tutorialspoint.com、google.com等。
h_aliases TI 它儲存主機名別名列表。
h_addrtype AF_INET 它包含地址族,對於基於網際網路的應用程式,它將始終為AF_INET。
h_length 4 它儲存IP地址的長度,對於網際網路地址為4。
h_addr_list in_addr 對於網際網路地址,指標陣列h_addr_list[0]、h_addr_list[1]等等指向結構in_addr。

注意 - h_addr 定義為 h_addr_list[0] 以保持向後相容性。

servent

此特定結構用於儲存與服務和關聯埠相關的資訊。

struct servent {
   char  *s_name; 
   char  **s_aliases; 
   int   s_port;  
   char  *s_proto;
};

以下是成員欄位的描述:

屬性 描述
s_name http 這是服務的正式名稱。例如,SMTP、FTP、POP3等。
s_aliases 別名 它儲存服務別名列表。大多數情況下,這將設定為NULL。
s_port 80 它將具有關聯的埠號。例如,對於HTTP,這將是80。
s_proto

TCP

UDP

它設定為使用的協議。網際網路服務是使用TCP或UDP提供的。

關於套接字結構的提示

套接字地址結構是每個網路程式不可或缺的一部分。我們分配它們,填寫它們,並將指向它們的指標傳遞給各種套接字函式。有時我們將這些結構之一的指標傳遞給套接字函式,它會填寫內容。

我們總是透過引用傳遞這些結構(即,我們傳遞指向結構的指標,而不是結構本身),並且我們總是將結構的大小作為另一個引數傳遞。

當套接字函式填寫結構時,長度也透過引用傳遞,以便其值可以被函式更新。我們稱這些值為結果引數。

始終使用memset()或bzero()函式將結構變數設定為NULL(即'\0'),否則你的結構中可能會出現意外的垃圾值。

廣告