ソケットは、ネットワークプロトコルに対してもっとも一般的に使用される低レベルインタフェースです。ソケットは、1981 年以来 SunOS リリースに不可欠な部分となっています。ソケットは通信の終端であり、名前をバインドできます。ソケットにはタイプがあり、関連プロセスが 1 つ存在します。ソケットは、次のようなプロセス間通信のためのクライアントサーバーモデルを実装するために設計されました。
ネットワークプロトコルのインタフェースが、TCP/IP、Xerox インターネットプロトコル (XNS)、UNIX ファミリのような複数の通信プロトコルを提供する必要がある
ネットワークプロトコルのインタフェースが、接続を待機するサーバーコードと接続を開始するクライアントコードを提供する必要がある
ネットワークプロトコルのインタフェースが、通信がコネクション型であるかコネクションレス型であるかに基づいて動作する必要がある
アプリケーションプログラムが、open(2) 呼び出しを使用してアドレスをバインドするのではなく、配信するデータグラムの宛先アドレスを指定する必要がある
ソケットは、UNIX ファイルのように動作し、ネットワークプロトコルが使用できるように処置します。アプリケーションは、必要に応じてソケットを作成します。ソケットは、close(2)、read(2)、write(2)、ioctl(2)、および fcntl(2) インタフェースと連携して動作します。オペレーティングシステムは、ファイルのファイル記述子とソケットのファイル記述子を区別します。
ソケットインタフェースルーチンは、アプリケーションとリンクが必要なライブラリ内に存在します。ライブラリ libsocket.so は、ほかのシステムサービスライブラリと共に /usr/lib に入っています。libsocket.so は、動的リンクに使用されます。
ソケットタイプは、ユーザーにもわかる通信プロパティを定義します。インターネットファミリソケットは、TCP/IP トランスポートプロトコルへのアクセスを提供します。インターネットファミリは、IPv6 と IPv4 の両方で通信できるソケットの場合、AF_INET6 という値で識別されます。また、古いアプリケーションとのソース互換、および IPv4 に対する raw (生の) アクセスを目的とした値 AF_INET もサポートされています。
サポートされる 3 つのタイプのソケットを次に示します。
ストリームソケットは、プロセスが TCP を使用して通信を行えるようにします。ストリームソケットは、信頼性の高い、順序付けされた、重複のない双方向データフローをレコード境界なしで提供します。接続が確立されたあと、これらのソケットからのデータの読み取り、およびこれらのソケットに対するデータの書き込みがバイトストリームとして行えます。ソケットタイプは SOCK_STREAM
です。
データグラムソケットは、プロセスが UDP を使用して通信を行えるようにします。データグラムソケットは、メッセージの双方向フローをサポートします。データグラムソケット側のプロセスは、送信シーケンスから順序を変えてメッセージを受信でき、重複したメッセージを受信できます。データ内のレコード境界は保持されます。ソケットタイプは SOCK_DGRAM
です。
raw ソケットは、ICMP へのアクセスを提供します。このタイプのソケットは、通常、データグラム型ですが、実際の特性はプロトコルが提供するインタフェースに依存します。raw ソケットは、ほとんどのアプリケーションには使用されません。このタイプは、新しい通信プロトコルの開発をサポートしたり、既存プロトコルの難解な機能にアクセスしたりするために提供されています。raw ソケットを使用できるのは、スーパーユーザープロセスだけです。ソケットタイプは SOCK_RAW
です。
詳細については、「特定のプロトコルの選択」を参照してください。
SunOS 5.8 には、2 セットのソケットインタフェース、BSD ソケットインタフェースと XNS 5 (Unix98) ソケットインタフェースが付属しています (XNS 5 ソケットは SunOS 5.7 以降)。XNS 5 インタフェースは、BSD インタフェースとわずかに異なります。
XNS 5 ソケットインタフェースについては、次のマニュアルページで説明されています。accept(3XNET)、bind(3XNET)、connect(3XNET)、 endhostent(3XNET)、endnetent(3XNET)、endprotoent(3XNET)、 endservent(3XNET)、gethostbyaddr(3XNET)、gethostbyname(3XNET)、 gethostent(3XNET)、gethostname(3XNET)、getnetbyaddr(3XNET)、 getnetbyname(3XNET)、getnetent(3XNET)、getpeername(3XNET)、 getprotobyname(3XNET)、getprotobynumber(3XNET)、 getprotoent(3XNET)、getservbyname(3XNET)、getservbyport(3XNET)、 getservent(3XNET)、getsockname(3XNET)、getsockopt(3XNET)、 htonl(3XNET)、htons(3XNET)、inet_addr(3XNET)、inet_lnaof(3XNET)、 inet_makeaddr(3XNET)、inet_netof(3XNET)、inet_network(3XNET)、 inet_ntoa(3XNET)、listen(3XNET)、ntohl(3XNET)、ntohs(3XNET)、 recv(3XNET)、recvfrom(3XNET)、recvmsg(3XNET)、send(3XNET)、 sendmsg(3XNET)、sendto(3XNET)、sethostent(3XNET)、 setnetent(3XNET)、setprotoent(3XNET)、setservent(3XNET)、 setsockopt(3XNET)、shutdown(3XNET)、socket(3XNET)、および socketpair(3XNET)。
従来の SunOS 5 BSD ソケットの動作については、対応する 3N のマニュアルページに説明されています。次のセクション 3N マニュアルページには、多くの新しいインタフェースが追加されました。freeaddrinfo(3SOCKET)、 freehostent(3SOCKET)、getaddrinfo(3SOCKET)、 getipnodebyaddr(3SOCKET)、getipnodebyname(3SOCKET)、 getnameinfo(3SOCKET)、inet_ntop(3SOCKET)、および inet_pton(3SOCKET)。XNS 5 (Unix98) ソケットインタフェースを使用するアプリケーションの構築については、standards(5) のマニュアルページを参照してください。