Unix Sockets 简明教程

Unix Socket - Structures

Unix 套接字编程中使用各种结构来保存有关地址和端口等信息的的信息。大多数套接字函数需要一个指向套接字地址结构的指针作为参数。本章定义的结构与 Internet 协议族相关。

sockaddr

第一个结构是 sockaddr,它保存套接字信息——

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

这是一个通用的套接字地址结构,它将在大多数套接字函数调用中传递。下表提供了成员字段的说明——

Attribute

Values

Description

sa_family

AF_INET AF_UNIX AF_NS AF_IMPLINK

它表示地址族。在大多数基于 Internet 的应用程序中,我们使用 AF_INET。

sa_data

Protocol-specific Address

根据地址的类型解释协议特定地址的 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];
};

下面是成员字段的说明 −

Attribute

Values

Description

sa_family

AF_INET AF_UNIX AF_NS AF_IMPLINK

它表示地址族。在大多数基于 Internet 的应用程序中,我们使用 AF_INET。

sin_port

Service Port

以网络字节顺序排列的 16 位端口号。

sin_addr

IP Address

以网络字节顺序排列的 32 位 IP 地址。

sin_zero

Not Used

你只需将该值设置为 NULL,因为未使用。

in addr

此结构仅用作以上结构中的结构字段,并保存 32 位网络 ID/主机 ID。

struct in_addr {
   unsigned long s_addr;
};

下面是成员字段的说明 −

Attribute

Values

Description

s_addr

service port

以网络字节顺序排列的 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]
};

下面是成员字段的说明 −

Attribute

Values

Description

h_name

ti.com etc.

这是主机的官方名称。例如,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 结构。

NOTE − 为保持向后兼容性,h_addr 定义为 h_addr_list[0]。

servent

此特定结构用于保存与服务和相关端口有关的信息。

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

下面是成员字段的说明 −

Attribute

Values

Description

s_name

http

这是服务的官方名称。例如,SMTP、FTP POP3 等。

s_aliases

ALIAS

保存服务别名列表。大多数情况下此内容将设置为 NULL。

s_port

80

将有相关端口号。例如,对于 HTTP,此端口号为 80。

s_proto

TCP UDP

它设置为使用的协议。互联网服务通过 TCP 或 UDP 提供。

Tips on Socket Structures

套接字地址结构是每个网络程序的组成部分。我们对其进行分配、填写,并将其指针传递给各种套接字函数。有时我们会向套接字函数传递指向其中一个结构的指针,它会填写内容。

我们总是通过引用方式传递这些结构(即,我们传递一个指向该结构的指针,而不是结构本身),并且我们总是将结构的大小作为一个其他参数传递。

当套接字函数填写一个结构时,长度也会通过引用进行传递,以便函数可以更新其值。我们将这些值称为值结果参数。

始终使用 memset()(对于 bzero() 函数)将结构变量设置为 NULL(即 '\0'),否则您的结构中可能会出现意外的垃圾值。