Socket 結構


有各種不同的Unix通訊端程式設計結構,用來儲存地址和埠資訊和其他資訊。大多數socket函式需要一個指向一個socket地址結構作為引數。在本教學中定義的結構與網際網路協定的家族。

第一個結構是struct sockaddr的持有通訊端資訊:

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

這是一個通用的通訊端地址結構在大部分的通訊端函式呼叫,將被傳遞。這裡是成員欄位的描述:

屬性 描述
sa_family AF_INET
AF_UNIX
AF_NS
AF_IMPLINK
This represents an address family. In most of the Internet based applications we use AF_INET.
sa_data Protocol Specific Address The content of the 14 bytes of protocol specific address are interpreted according to the type of address. For the Internet family we will use port number IP address which is represented bysockaddr_in structure defined below.

第二個結構,幫助參照通訊端的元素如下:

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
This represents an address family. In most of the Internet based applications we use AF_INET.
sin_port Service Port A 16 bit port number in Network Byte Order.
sin_addr IP Address A 32 bit IP address in Network Byte Order.
sin_zero Not Used You just set this value to NULL as this is not being used.

下一個結構僅用於上述結構中的一個結構域,並擁有32位元的netid/主機ID。

struct in_addr {
	unsigned long s_addr;
};

這裡是成員欄位的描述:

屬性 描述
s_addr service port A 32 bit IP address in Network Byte Order.

還有一個更重要的結構。這個結構是用來保持主機相關的資訊。

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 etc This is official name of the host. For example tutorialspoint.com, google.com etc.
h_aliases TI This will hold a list of host name aliases.
h_addrtype AF_INET This contains the address family and in case of Internet based application it will always be AF_INET
h_length 4 This will hold the length of IP address which is 4 for Internet Address.
h_addr_list in_addr For the Internet addresses the array of pointers h_addr_list[0], h_addr_list[1] and so on are points to structure in_addr.

註: h_addr被定義為h_addr_list[0],以保持向後相容。.

下面的結構是用來保持服務和相關聯的埠有關的資訊。

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

這裡是成員欄位的描述:

屬性 描述
s_name http 這是官方的服務名稱。例如SMTP,FTP POP3等。
s_aliases ALIAS 其將存放服務別名的列表。大部分的時間將被設定為NULL。
s_port 80 這將有相關聯的埠號。例如HTTP,則為80。
s_proto TCP 
UDP
這將被設定為所使用的協定。使用TCP或UDP網路服務。

通訊端結構上的提示:

通訊端地址結構是每一個網路程式的一個組成部分。我們分配填補在指標傳遞給它們的各種通訊端函式。有時候,我們通過一個這樣的結構指標的socket函式,它填補了的內容。

我們總是通過參照傳遞這些結構(即我們傳遞一個指標的結構,而不是結構本身),我們總是通過結構的大小作為另一個引數。

當通訊端函式填充在一個結構中,長度也通過參照傳遞的,因此它的值由該函式可以被更新。我們稱這些結果值引數。

請務必將結構體變數設定為NULL(即'\0')用memset()的bzero()函式,否則在你的結構,它可能會得到意想不到的垃圾值。