Berkeley 软件分发兼容性
套接字是一个 Berkeley Software Distribution (BSD) 接口。
语义 (例如应用程序接收的返回码以及受支持函数上可用的参数) 是 BSD 语义。 但是,IBM i 实现中不提供某些 BSD 语义,因此可能需要对典型的 BSD 套接字应用程序进行修改,才能使其在系统上运行。
以下列表汇总了 IBM i 实现与 BSD 实现之间的差异。
- /etc/hosts, /etc/services, /etc/networks, 和 /etc/protocols
- 对于这些文件, IBM i 实现提供以下数据库文件。
QUSRSYS 文件 内容 QATOCPN 网络和相应 IP 地址的列表。 QATOCPP 因特网中使用的协议的列表。 QATOCPS 服务以及服务使用的特定端口和协议的列表。 - /etc/resolv.conf
- IBM i 实现要求使用 IBM Navigator for i中的 TCP/IP 属性页面配置此信息。 要访问 TCP/IP 属性页面,请完成以下步骤:
- 从 IBM Navigator for i ,展开 ,然后单击 TCP/IP 配置属性。
- 选择 主机域信息 选项卡。
- 保存和复原 TCP/IP 配置信息
- 检索 TCP/IP 信息 (RTVTCPINF) 命令从缺省系统位置收集关键 TCP/IP 配置信息,并将其放在 Library (LIB) 参数指定的库中。 可在系统上通过“更新 TCP/IP 信息”(UPDTCPINF) 命令来重置或复原 TCP/IP 配置。
- bind()
在 BSD 系统上,客户机可以使用 socket()创建 AF_UNIX 套接字,使用 connect()连接到服务器,然后使用 bind()将名称绑定到其套接字。 IBM i 实现不支持此方案 ( bind() 失败)。
- close()
IBM i 实现支持 close() API 的 linger 计时器,但基于系统网络体系结构 (SNA) 的 AF_INET 套接字除外。 某些 BSD 实现不支持 close() API 的 linger 计时器。
- connect()
在 BSD 系统上,如果针对先前已连接到地址且正在使用无连接传输服务的套接字发出 connect() ,并且使用了无效地址或无效地址长度,那么将不再连接该套接字。 IBM i 实现不支持此方案 ( connect() 失败并且套接字仍处于连接状态)。
可以通过将 address_length 参数设置为零并发出另一个 connect()来断开已发出 connect() 的无连接传输套接字。
- accept(), getsockname(), getpeername(), recvfrom()和 recvmsg()
当使用 AF_UNIX 或 AF_UNIX_CCSID 地址系列并且套接字尚未绑定时,缺省 IBM i 实现可能会返回地址长度为零和未指定的地址结构。 IBM i BSD 4.4/ UNIX 98 和其他实现可能返回一个仅指定了地址系列的小型地址结构。
- ioctl()
- 在 BSD 系统上,在类型为 SOCK_DGRAM 的套接字上, FIONREAD 请求返回数据的长度加上地址的长度。 在 IBM i 实现上, FIONREAD 仅返回数据长度。
- 并非 ioctl() 的大多数 BSD 实现上可用的所有请求都在 ioctl()的 IBM i 实现上可用。
- listen()
在 BSD 系统上,发出任务列表参数设置为小于零的值的 listen() 不会导致错误。 此外, BSD 实现在某些情况下不使用积压参数,或者使用算法来得出积压值的最终结果。 如果积压值小于零,那么 IBM i 实现会返回错误。 如果将任务列表设置为有效值,那么该值将用作任务列表。 但是,将积压设置为大于 {SOMAXCONN}的值时,积压缺省为 {SOMAXCONN}中设置的值。
- 频带外 (OOB) 数据
在 IBM i 实现中,如果未设置 SO_OOBINLINE ,接收到 OOB 数据,然后用户将 SO_OOBINLINE 设置为打开,那么不会废弃 OOB 数据。 初始 OOB 字节被视为正常数据。
- socket() 的协议参数
作为提供额外安全性的方法,不允许用户创建指定 IPPROTO_TCP 或 IPPROTO_UDP 协议的 SOCK_RAW 套接字。
- res_xlate() 和 res_close()
这些 API 包含在 IBM i 实现的解析器例程中。 res_xlate() API 将域名系统 (DNS) 包从 EBCDIC 转换为 ASCII ,并从 ASCII 转换为 EBCDIC。 res_close() API 用于关闭 res_send() API 使用的具有 RES_STAYOPEN 选项集的套接字。 res_close() API 还会重置 _res 结构。
- sendmsg() 和 recvmsg()
sendmsg() 和 recvmsg() 的 IBM i 实现允许 {MSG_MAXIOVLEN} I/O 向量。 BSD 实现允许 {MSG_MAXIOVLEN - 1} I/O 向量。
- 信号
- 有几个与信号支持相关的差异:
- BSD 实现在每次接收到在输出操作上发送的数据的应答时发出 SIGIO 信号。 IBM i 套接字实现不会生成与出站数据相关的信号。
- SIGPIPE 信号的缺省操作是结束 BSD 实现中的进程。 为了保持与 IBM i的先前发行版的向下兼容性, IBM i 实现对 SIGPIPE 信号使用了忽略的缺省操作。
- SO_REUSEADDR 选项
在 BSD 系统上,类型为 SOCK_DGRAM 的系列 AF_INET 的套接字上的 connect() 全部会导致系统将套接字绑定到的地址更改为用于访问 connect() API 上指定的地址的接口的地址。 例如,如果将类型为 SOCK_DGRAM 的套接字绑定到地址 INADDR_ANY ,然后将其连接到地址 a.b.c.d,那么系统会更改套接字,以便现在将其绑定到选择用于将包路由到地址 a.b.c.d的接口的 IP 地址。 此外,如果套接字绑定到的此 IP 地址为 a.b.c.e,例如,地址 a.b.c.e 现在显示在 getsockname() API 上,而不是 INADDR_ANY ,并且必须使用 SO_REUSEADDR 选项将任何其他套接字绑定到地址为 a.b.c.e的同一端口号。
相反,在此示例中, IBM i 实现不会将本地地址从 INADDR_ANY 更改为 a.b.c.e。 执行连接后, getsockname() API 将继续返回 INADDR_ANY。
- SO_SNDBUF 和 SO_RCVBUF 选项
为 BSD 系统上的 SO_SNDBUF 和 SO_RCVBUF 设置的值提供的控制级别高于 IBM i 实现上的控制级别。 在 IBM i 实现上,这些值将用作咨询值。