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'),否则你的结构中可能会出现意外的垃圾值。

广告