バークレー・ソフトウェア・ディストリビューションとの互換性

ソケットはバークレー・ソフトウェア・ディストリビューション (BSD) のインターフェースです。

アプリケーションが受け取る戻りコードやサポートされている関数で 使用可能な引数などのセマンティクスは、BSD のセマンティクスです。ただし、IBM® i の実装環境では、一部の BSD セマンティクスは使用できません。また、システムでは、標準的な BSD ソケット・アプリケーションも変更を加えないと実行できない場合があります。

以下のリストは、IBM i の実装環境と BSD の実装環境との違いを要約したものです。

/etc/hosts、/etc/services、/etc/networks、および /etc/protocols
これらのファイルについては、IBM i の実装環境では、以下のデータベース・ファイルが提供されます。
QUSRSYS ファイル 内容
QATOCPN ネットワークとそれに対応する IP アドレスのリスト。
QATOCPP インターネットで使用されるプロトコルのリスト。
QATOCPS サービスおよびサービスで使用する特定のポートとプロトコルのリスト。
ホスト名とそれに対応する IP アドレスのリストを含むホスト・テーブ ルがファイル /QIBM/UserData/OS400/TCPIP/QTOCHOSTS に保管され ます。
/etc/resolv.conf
IBM i の実装環境では、この情報は、IBM Navigator for i の TCP/IP プロパティー・ページを使用して構成する必要があります。 TCP/IP プロパティー・ページにアクセスするには、以下のステップを実行します。
  1. IBM Navigator for i から、「IBM i の管理」 > 「ネットワーク」 > 「すべてのタスク」 > 「TCP/IP 構成」と展開します。
  2. 「TCP/IP 構成プロパティー」をクリックします。
TCP/IP 構成情報の保管と復元
TCP/IP 情報の取得 (RTVTCPINF) コマンドは、デフォルトのシステム・ロケーションから主要な TCP/IP 構成情報を収集し、収集した情報を、ライブラリー (LIB) パラメーターで指定されたライブラリーに入れます。 収集された TCP/IP 構成情報は、システムの TCP/IP 構成をリセットしたり復元したりするために、TCP/IP 情報の更新 (UPDTCPINF) コマンドによって使用することができます。
bind()

BSD システムでは、クライアントは socket() を使用して AF_UNIX ソケットを作成し、connect() を使用してサーバーに接続し、次いで bind() を使用して名前をソケットにバインドできます。IBM i の実装環境は、このシナリオをサポートしません (bind() は失敗します)。

close()

IBM i の実装環境は、システム・ネットワーク体系 (SNA) 上の AF_INET ソケットを除けば、close() API のリンガー・タイマーをサポートします。 一部の BSD では、close() API に対してリンガー・タイマーをサポートしていません。

connect()

BSD システムでは、connect() が以前にアドレスに接続されていたソケットに対して発行され、 コネクションレス型トランスポート・サービスを使用しており、 無効なアドレスまたは無効なアドレス長が使用されている場合は、ソケットは切断されます。IBM i の実装環境は、このシナリオをサポートしません (connect() は失敗し、ソケットは接続されたままになります)。

connect() が発行されたコネクションレス型トランスポート・ソケットは、address_length パラメーターをゼロに設定して、別の 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 の実装環境の resolver ルーチンに組み込まれています。 res_xlate() API はドメイン・ネーム・システム (DNS) のパケットを、EBCDIC から ASCII へ、また ASCII から EBCDIC へ変換します。res_close() API を使用すれば、RES_STAYOPEN オプションが設定された res_send() API が使用していたソケットをクローズできます。また、res_close() API は _res 構造もリセットします。

sendmsg() および recvmsg()

sendmsg() および recvmsg()IBM i の実装環境では、{MSG_MAXIOVLEN} 入出力ベクトルが許可されます。 BSD では、{MSG_MAXIOVLEN - 1} 入出力ベクトルが許可されます。

信号
信号サポートに関連したいくつかの相違点を以下に示します。
  • BSD 実装は、出力命令で送信されたデータについて、肯定応答を受信するた びに、SIGIO 信号を出します。IBM i ソケットの実装環境はアウトバウンド・データに関連した信号を生成しません。
  • BSD 実装での SIGPIPE 信号のデフォルトの動作は、処理を終了させることです。IBM i の旧リリースとの下位互換性を維持するために、IBM i の実装環境は SIGPIPE 信号に対して無視というデフォルト動作を使用します。
SO_REUSEADDR オプション

BSD システムの場合、AF_INET ファミリーおよびタイプ SOCK_DGRAM のソケットで 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 は INADDR_ANY の代わりに getsockname() API に現れるので、 他のソケットをアドレスが a.b.c.e である同一のポート番号にバインドするには、SO_REUSEADDR オプションを使用しなければなりません。

反対に、この例では、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 の実装環境では、これらの値は推奨値と見なされます。