Unix套接字编程中使用各种结构来保存关于地址和端口的信息以及其他信息。大多数套接字函数需要一个指向套接字地址结构体的指针作为参数。本章定义的结构与Internet协议族有关。
sockaddr
第一个结构是sockaddr,它保存了套接字信息−
struct sockaddr {
unsigned short sa_family;
char sa_data[14];
};
这是一个通用的套接字地址结构,它将在大多数套接字函数调用中传递。成员字段说明如下表所示
属性:sa_family,值:AF_INET、AF_UNIX、AF_NS、AF_IMPLINK,描述:它表示一个地址族。在大多数基于internet的应用程序中,我们使用AF_INET。
属性:sa_data,值:特定于协议的地址,描述:协议特定地址的14字节内容将根据地址的类型进行解释。对于Internet家族,我们将使用端口号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,描述:它表示一个地址族。在大多数基于internet的应用程序中,我们使用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地址的长度,Internet地址为4。
属性:h_addr_list,值:in_addr,描述:对于Internet地址,指针数组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,值:ALIAS,描述:它保存服务别名列表。大多数情况下,这将被设置为NULL。
属性:s_port,值:80,描述:它将具有关联的端口号。例如,对于HTTP,这将是80。
属性:s_proto,值:TCP、UDP,描述:设置为所使用的协议。Internet服务使用TCP或UDP提供。
套接字结构一些建议
套接字地址结构是每个网络程序不可分割的一部分。我们分配它们,填充它们,并将指向它们的指针传递给各种套接字函数。有时,我们将指向这些结构之一的指针传递给套接字函数,它会填充内容。
我们总是通过引用传递这些结构体(即,我们传递的是指向结构体的指针,而不是结构体本身),并且我们总是将结构体的大小作为另一个参数传递。
当套接字函数填充结构时,长度也通过引用传递,这样函数就可以更新它的值。我们称之为value-result参数。
总是,通过对bzero()函数使用memset()将结构变量设置为NULL(即'\0'),否则它可能会在结构中得到意想不到的垃圾值。