套接字地址结构

套接字使用 sockaddr 地址结构来传递和接收地址。 此结构不需要套接字 API 来识别寻址格式。

目前,IBM i 操作系统支持 Berkeley Software Distribution (BSD) 4.3 和 X/Open Single UNIX Specification (UNIX 98)。 基本 IBM i API 使用 BSD 4.3 结构和语法。 可以通过将 _XOPEN_SOURCE 宏定义为 520 或更大的值来选择 UNIX 98 兼容接口。 所使用的 BSD 4.3 的每个套接字地址结构都具有等效的 UNIX 98 结构。

表 1. BSD 4.3 和 BSD 4.4/ UNIX 98 套接字地址结构的比较
BSD 4.3 结构 BSD 4.4/ UNIX 98 兼容结构
struct sockaddr{
  u_short   sa_family;
  char      sa_data [14];
};
struct sockaddr_storage{
  sa_family_t  ss_family;
  char         _ss_pad1[_SS_PAD1SIZE];
  char*        _ss_align;
  char         _ss_pad2[_SS_PAD2SIZE];
};
struct sockaddr {
  uint8_t       sa_len;
  sa_family_t   sa_family
  char          sa_data[14]
};
struct sockaddr_storage {
  uint8_t       ss_len;
  sa_family_t   ss_family;
  char          _ss_pad1[_SS_PAD1SIZE];
  char*         _ss_align;
  char          _ss_pad2[_SS_PAD2SIZE];
};
表 2。 地址结构
地址结构字段 定义
萨伦 此字段包含 UNIX 98 规范的地址长度。
注: 仅为 BSD 4.4 兼容性提供了 sa_len 字段。 即使对于 BSD 4.4/UNIX 98 兼容性,也不需要使用此字段。 将在输入地址上忽略该字段。
sa_family 此字段定义地址系列。 为 socket() 调用上的地址系列指定此值。
sa_data 此字段包含保留用于保存地址本身的 14 个字节。
注: 14 字节的 sa_data 长度是地址的占位符。 地址可以超过此长度。 此结构是通用结构,因为它未定义地址的格式。 地址的格式由为其创建套接字的传输类型定义。 每个传输提供者都在类似的地址结构中定义其特定寻址需求的准确格式。 传输由 socket() API 上的协议参数值标识。
sockaddr_storage 此字段声明任何地址系列地址的存储器。 此结构足够大,并且与任何特定于协议的结构一致。 然后,可以将其强制转换为 sockaddr 结构以在 API 上使用。 sockaddr_storage 的 ss_family 字段始终与任何特定于协议的结构的 family 字段一致。