バークレー( BSD ) ソケットは、インターネット ドメイン ソケットおよびUnix ドメイン ソケットのアプリケーション プログラミング インターフェイス(API)であり、プロセス間通信(IPC) に使用されます。通常、リンク可能なモジュールのライブラリとして実装されます。1983年にリリースされた 4.2BSD Unixオペレーティング システムで生まれました。
ソケットは、ネットワーク通信パスのローカル エンドポイントの抽象表現 (ハンドル) です。Berkeley ソケット API は、これをUnix 哲学のファイル記述子として表現し、データ ストリームへの入出力のための共通インターフェイスを提供します。
Berkeley ソケットは、事実上の標準からPOSIX仕様のコンポーネントへとほとんど変更されることなく進化しました。POSIXソケットという用語は、基本的にBerkeley ソケットと同義ですが、 Berkeley Software Distributionでの最初の実装を認めて、BSD ソケットとも呼ばれます。
歴史と実装
バークレー ソケットは、1983 年にリリースされた4.2BSD Unix オペレーティング システムでプログラミング インターフェイスとして利用されました。しかし、カリフォルニア大学バークレー校がAT&T 社の独自仕様 Unix のライセンス制約から解放されたバージョンのオペレーティング システムとネットワーク ライブラリをリリースできたのは、1989 年になってからでした。
現代のオペレーティング システムはすべて、Berkeley ソケット インターフェイスのバージョンを実装しています。これは、インターネットで実行されるアプリケーションの標準インターフェイスになりました。MS Windows 用のWinsock実装も、無関係の開発者によって作成され、この標準に厳密に従っています。
BSDソケットAPIはCプログラミング言語で書かれています。他のほとんどのプログラミング言語も同様のインターフェースを提供しており、通常はC APIに基づくラッパーライブラリとして書かれています。 [1]
BSD および POSIX ソケット
Berkeley ソケット API が進化し、最終的に POSIX ソケット API が誕生するにつれ、[2]特定の関数は廃止または削除され、他の関数に置き換えられました。POSIX API は再入可能で IPv6 もサポートするように設計されました。
代替案
STREAMSベースのトランスポート層インターフェイス(TLI) APIは、ソケット API の代替を提供します。TLI API を提供する多くのシステムは、Berkeley ソケット API も提供します。
非Unixシステムでは、ネイティブネットワークAPIへの変換レイヤーを備えたBerkeleyソケットAPIを公開することがよくあります。Plan 9 [3]とGenode [4]は、ファイル記述子ではなく制御ファイルを備えたファイルシステムAPIを使用します。
ヘッダーファイル
Berkeley ソケット インターフェイスは、いくつかのヘッダー ファイルで定義されています。これらのファイルの名前と内容は、実装ごとに若干異なります。一般的には、次のものが含まれます。
ソケットAPI関数

Berkeley ソケット API は通常、次の機能を提供します。
- socket() は、整数で識別される特定のタイプの新しいソケットを作成し、それにシステム リソースを割り当てます。
- bind() は通常サーバー側で使用され、ソケットをソケット アドレス構造 (指定されたローカル IP アドレスとポート番号) に関連付けます。
- listen()はサーバー側で使用され、バインドされた TCP ソケットをリスニング状態に移行させます。
- connect() はクライアント側で使用され、空きローカルポート番号をソケットに割り当てます。TCP ソケットの場合は、新しい TCP 接続を確立しようとします。
- accept()はサーバー側で使用されます。リモート クライアントから受信した新しい TCP 接続を作成するための試行を受け入れ、この接続のソケット アドレス ペアに関連付けられた新しいソケットを作成します。
- データの送受信には、send()、recv()、sendto()、およびrecvfrom()が使用されます。標準関数write()およびread()も使用できます。
- close() は、システムがソケットに割り当てられたリソースを解放するようにします。TCP の場合、接続は終了します。
- gethostbyname()とgethostbyaddr() は、ホスト名とアドレスを解決するために使用されます。IPv4 のみ。
- getaddrinfo()とfreeaddrinfo() は、ホスト名とアドレスを解決するために使用されます。IPv4、IPv6。
- select()は、指定されたソケットのリストのうち 1 つ以上が読み取り準備完了、書き込み準備完了、またはエラーが発生するまで待機して、一時停止するために使用されます。
- poll()は、ソケット セット内のソケットの状態を確認するために使用されます。セットをテストして、ソケットに書き込みや読み取りができるかどうか、またはエラーが発生したかどうかを確認できます。
- getsockopt() は、指定されたソケットの特定のソケット オプションの現在の値を取得するために使用されます。
- setsockopt() は、指定されたソケットの特定のソケット オプションを設定するために使用されます。
ソケット
socket()関数は通信のエンドポイントを作成し、ソケットの ファイル記述子を返します。次の 3 つの引数を使用します。
- domain は、作成されたソケットのプロトコル ファミリを指定します。例:
- タイプ、次のいずれか:
- SOCK_STREAM (信頼性の高いストリーム指向サービスまたはストリームソケット)
- SOCK_DGRAM (データグラム サービスまたはデータグラム ソケット)
- SOCK_SEQPACKET (信頼性の高いシーケンス パケット サービス)
- SOCK_RAW (ネットワーク層の上位にある生のプロトコル)
- 実際に使用するトランスポート プロトコルを指定するプロトコル。最も一般的なプロトコルは、 IPPROTO_TCP、 IPPROTO_SCTP、 IPPROTO_UDP、 IPPROTO_DCCPです。これらのプロトコルは、ファイルnetinet/in.hで指定されます。値0 を使用すると、選択したドメインとタイプから既定のプロトコルを選択できます。
エラーが発生した場合、 関数は-1を返します。それ以外の場合は、新しく割り当てられた記述子を表す整数を返します。
バインド
bind() はソケットをアドレスに関連付けます。 socket()でソケットを作成すると、プロトコル ファミリのみが与えられ、アドレスは割り当てられません。ソケットが他のホストからの接続を受け入れる前に、この関連付けを実行する必要があります。この関数には 3 つの引数があります。
- sockfd、ソケットを表す記述子
- my_addr 、バインドするアドレスを表すsockaddr構造体へのポインター。
- addrlen は、 sockaddr構造体のサイズを指定するsocklen_t型のフィールドです。
bind() は成功した場合は 0 を返し、エラーが発生した場合は -1 を返します。
聞く
ソケットがアドレスに関連付けられた後、listen() は着信接続のためにソケットを準備します。ただし、これはストリーム指向 (接続指向) データ モード、つまりソケット タイプ ( SOCK_STREAM、SOCK_SEQPACKET ) の場合にのみ必要です。listen() には 2 つの引数が必要です。
- sockfd、有効なソケット記述子。
- backlog は、一度にキューに入れることができる保留中の接続の数を表す整数です。通常、オペレーティング システムではこの値に上限が設定されます。
接続が受け入れられると、キューから削除されます。成功した場合は 0 が返されます。エラーが発生した場合は -1 が返されます。
受け入れる
アプリケーションが他のホストからのストリーム指向の接続をリッスンしている場合、そのようなイベントが通知され ( select()関数を参照)、関数accept()を使用して接続を初期化する必要があります。この関数は、接続ごとに新しいソケットを作成し、リッスン キューから接続を削除します。この関数には次の引数があります。
- sockfd、接続がキューに入れられているリスニングソケットの記述子。
- cliaddr は、クライアントのアドレス情報を受信するための sockaddr 構造体へのポインタです。
- addrlen は、 accept() に渡されるクライアント アドレス構造体のサイズを指定するsocklen_t の場所へのポインタです。accept ()が返されると、この場所に構造体のサイズ (バイト単位) が含まれます。
accept() は、受け入れられた接続の新しいソケット記述子を返します。エラーが発生した場合は値-1 を返します。リモート ホストとの以降のすべての通信は、この新しいソケットを介して行われます。
データグラム ソケットでは、受信側がリスニング ソケットを使用して要求にすぐに応答できるため、accept() による処理は必要ありません。
接続する
connect() は、ファイル記述子によって識別されるソケットを介して、アドレスによって識別される特定のリモート ホストへの直接通信リンクを確立します。
コネクション指向プロトコルを使用する場合、これによって接続が確立されます。特定の種類のプロトコルはコネクションレス型であり、最も有名なのはユーザー データグラム プロトコルです。コネクションレス型プロトコルで使用する場合、connect はデータの送受信用のリモート アドレスを定義し、sendやrecvなどの関数の使用を可能にします。このような場合、 connect 関数は他のソースからのデータグラムの受信を防止します。
connect() はエラーコードを表す整数を返します。0は成功、-1はエラーを表します。歴史的に、BSD 由来のシステムでは、connectの呼び出しが失敗した場合、ソケット記述子の状態は未定義です (Single Unix 仕様で指定されているとおり)。そのため、移植可能なアプリケーションでは、connect() の呼び出しが失敗した場合、ソケット記述子をすぐに閉じて、socket() で新しい記述子を取得する必要があります。[5]
gethostbyname と gethostbyaddr
gethostbyname()関数とgethostbyaddr()関数は、ドメイン ネーム システムまたはローカル ホストの他のリゾルバ メカニズム (/etc/hosts ルックアップなど)内のホスト名とアドレスを解決するために使用されます。これらの関数は、インターネット プロトコルホストを記述するstruct hostent型のオブジェクトへのポインタを返します。これらの関数は、次の引数を使用します。
- name はホストの名前を指定します。
- addr は、ホストのアドレスを含むstruct in_addrへのポインタを指定します。
- len はaddrの長さをバイト単位で指定します。
- type は、ホスト アドレスのアドレス ファミリ タイプ (例: AF_INET) を指定します。
エラーが発生した場合、関数は NULL ポインタを返します。この場合、外部整数h_errno をチェックして、これが一時的な障害であるか、無効または不明なホストであるかを確認できます。それ以外の場合は、有効なstruct hostent *が返されます。
これらの関数は厳密にはBSDソケットAPIのコンポーネントではありませんが、ホストを検索するためのAPI関数と組み合わせて使用されることがよくあります。これらの関数は現在、ドメインネームシステムを照会するためのレガシーインターフェースと見なされています。完全にプロトコルに依存しない(IPv6をサポートする)新しい関数が定義されています。これらの新しい関数はgetaddrinfo()とgetnameinfo()で、新しいaddrinfoデータ構造に基づいています。[6]
この 2 つの関数は、BSD ソケット API 本体と同時に 4.2BSD (1983) に登場しました。[7]これは DNS が初めて作成されたのと同じ年です。初期のバージョンでは DNS に問い合わせることはなく、/etc/hosts の検索のみを実行しました。4.3BSD (1984) バージョンでは、DNS が粗雑な方法で追加されました。ネーム サービス スイッチを使用した現在の実装は、Solaris とその後の NetBSD 1.4 (1999) に由来しています。[8] NIS+用に最初に定義されたNSS では、DNS はこれらの関数による検索の多くのオプションの 1 つにすぎず、今日でもその使用を無効にすることができます。[9]
プロトコルとアドレスファミリ
Berkeley ソケット API は、ネットワークおよびプロセス間通信用の一般的なインターフェイスであり、さまざまなネットワーク プロトコルとアドレス アーキテクチャの使用をサポートします。
以下に、最近のLinuxまたはBSD実装で定義されているプロトコル ファミリ (先頭に標準のシンボリック識別子が付く) のサンプルを示します。
socket()関数では、必要なプロトコル ファミリ ( PF_識別子) を引数として
指定することで、通信用のソケットが作成されます。
ソケットインターフェースの元々の設計概念では、プロトコルタイプ(ファミリ)と、それぞれが使用できる特定のアドレスタイプを区別していました。プロトコルファミリには複数のアドレスタイプがあると考えられていました。アドレスタイプは、PFではなくAFという接頭辞を使用して、追加の記号定数によって定義されました。AF識別子は、プロトコルファミリではなく、アドレスタイプを具体的に扱うすべてのデータ構造を対象としています。ただし、プロトコルとアドレスタイプを分離するというこの概念は実装でサポートされておらず、AF定数は対応するプロトコル識別子によって定義されていたため、 AF定数とPF定数の区別は、実用的な意味を持たない技術的な議論のままになっています。実際、両方の形式の適切な使用法については多くの混乱があります。[11]
POSIX.1—2008仕様ではPF定数は規定されておらず、AF定数のみが規定されている[12]
生のソケット
生のソケットは、ホストのTCP/IPスタックによる処理をバイパスするシンプルなインターフェースを提供します。生のソケットは、ユーザー空間でのネットワークプロトコルの実装を可能にし、プロトコルスタックのデバッグに役立ちます。[13]生のソケットは、TCP/IPモデルのインターネット層で動作するICMPなどの一部のサービスによって使用されます。
ブロッキングモードと非ブロッキングモード
Berkeley ソケットは、ブロッキング モードと非ブロッキング モードのいずれかで動作できます。
ブロッキングソケットは、操作に指定されたデータの一部または全部を送信(または受信)するまで制御を返しません。ブロッキングソケットがすべてのデータを送信しないのは正常です。アプリケーションは戻り値をチェックして、送信または受信したバイト数を判断し、まだ処理されていないデータがあれば再送信する必要があります。[14]ブロッキングソケットを使用する場合、接続フェーズ中にクライアントが切断された場合、読み取り可能を示した後もブロックされる可能性があるため、accept() には特別な配慮が必要です。
非ブロッキング ソケットは、受信バッファにあるものを返して、すぐに処理を続行します。正しく記述されていない場合、非ブロッキング ソケットを使用するプログラムは、ネットワーク リンク速度の変動による競合状態に特に影響されやすくなります。[引用が必要]
ソケットは通常、 fcntl関数とioctl関数を使用してブロッキング モードまたは非ブロッキング モードに設定されます。
ソケットの終了
オペレーティング システムは、ソケットが閉じられるまで、ソケットに割り当てられたリソースを解放しません。これは、接続呼び出しが失敗し、再試行される場合に特に重要です。
アプリケーションがソケットを閉じると、ソケットへのインターフェースのみが破棄されます。ソケットを内部的に破棄するのはカーネルの責任です。場合によっては、ソケットはサーバー側で最大4分間TIME_WAIT状態になることがあります。 [15]
SVR4システムでは、を使用するとclose()データが破棄される可能性があります。shutdown()これらのシステムでは、すべてのデータの配信を保証するために、またはSO_LINGERの使用が必要になる場合があります。[16]
TCP を使用したクライアント サーバーの例
伝送制御プロトコル(TCP) は、バイト ストリームの伝送にさまざまなエラー修正機能とパフォーマンス機能を提供する接続指向socket()プロトコルです。プロセスは、プロトコル ファミリ ( PF INET、PF_INET6 )、ストリーム ソケットのソケット モード( SOCK_STREAM )、および TCP の IP プロトコル識別子 ( IPPROTO_TCP ) のパラメーターを使用して関数を呼び出すことにより、TCP ソケットを作成します。
サーバ
TCP サーバーを確立するには、次の基本的な手順を実行します。
- socket()を呼び出して TCP ソケットを作成します。
- ポート番号を設定した後、ソケットをリスニング ポートにバインドします ( bind() )。
- listen()を呼び出して、ソケットが接続をリッスンする準備をします (リスニング ソケットにします) 。
- 着信接続の受け入れ ( accept() )。これは、着信接続が受信されるまでプロセスをブロックし、受け入れられた接続のソケット記述子を返します。最初の記述子はリスニング記述子のままであり、ソケットが閉じられるまで、いつでもaccept()を再度呼び出すことができます。
- API 関数send()およびrecv()、および汎用関数write()およびread()を使用してリモート ホストと通信します。
- 使用後に開かれた各ソケットを関数close()で閉じる
次のプログラムは、ポート番号 1100 でリッスンする TCP サーバーを作成します。
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main ( void ) { struct sockaddr_in sa ; int SocketFD = socket ( PF_INET , SOCK_STREAM , IPPROTO_TCP ); if ( SocketFD == -1 ) { perror ( "ソケットを作成できません" ); exit ( EXIT_FAILURE ); } memset ( & sa , 0 , sizeof sa ); sa . sin_family = AF_INET ; sa . sin_port = htons ( 1100 ); sa . sin_addr . s_addr = htonl ( INADDR_ANY ); if ( bind ( SocketFD ,( struct sockaddr * ) & sa , sizeof sa ) == -1 ) { perror ( "bind failed" ); close ( SocketFD ); exit ( EXIT_FAILURE ); } if ( listen ( SocketFD , 10 ) == -1 ) { perror ( "listen failed" ); close ( SocketFD ); exit ( EXIT_FAILURE ); } for (;;) { int ConnectFD = accept ( SocketFD , NULL , NULL ); if ( ConnectFD == -1 ) { perror ( "accept failed" ); close ( SocketFD );
exit ( EXIT_FAILURE );
} /* 読み取り書き込み操作を実行します ... read(ConnectFD, buff, size) */ if ( shutdown ( ConnectFD , SHUT_RDWR ) == -1 ) { perror ( "shutdown failed" ); close ( ConnectFD ); close ( SocketFD ); exit ( EXIT_FAILURE ); } close ( ConnectFD ); }
閉じる( SocketFD );
EXIT_SUCCESSを返す; }
クライアント
TCP クライアント アプリケーションのプログラミングには、次の手順が含まれます。
- TCP ソケットを作成しています。
- AF_INETに設定され、エンドポイントがリッスンしているポート (ネットワーク バイト オーダー) に設定され、リッスンしているサーバーの IP アドレス (これもネットワーク バイト オーダー) に設定され
sockaddr_inた構造体を渡すことによって、サーバーに接続します ( connect() )。sin_familysin_portsin_addr - API 関数send()およびrecv()、および汎用関数write()およびread()を使用してリモート ホストと通信します。
- 使用後に開かれた各ソケットを関数close()で閉じます。
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main ( void ) { struct sockaddr_in sa ; int res ; int SocketFD ;
SocketFD = socket ( PF_INET , SOCK_STREAM , IPPROTO_TCP ); if ( SocketFD == -1 ) { perror ( "ソケットを作成できません" ) ; exit ( EXIT_FAILURE ) ; } memset ( & sa , 0 , sizeof sa ); sa.sin_family = AF_INET ; sa.sin_port = htons ( 1100 ) ; res = inet_pton ( AF_INET , " 192.168.1.3 " , & sa.sin_addr ) ;
if ( connect ( SocketFD , ( struct sockaddr * ) & sa , sizeof sa ) == -1 ) { perror ( "connect failed" ); close ( SocketFD ); exit ( EXIT_FAILURE ); } /* 読み取り書き込み操作を実行します... */ close ( SocketFD ); return EXIT_SUCCESS ; }
UDP を使用したクライアント サーバーの例
ユーザー データグラム プロトコル( UDP ) は、配信の保証のないコネクションレスプロトコルです。UDP パケットは、順序どおりに到着しなかったり、複数回到着したり、まったく到着しなかったりする場合があります。この最小限の設計により、UDP は TCP よりもオーバーヘッドが大幅に少なくなります。コネクションレスであるということは、2 つのホスト間にストリームや永続的な接続の概念がないことを意味します。このようなデータは、データグラム (データグラム ソケット) と呼ばれます。
UDP アドレス空間、つまり UDP ポート番号の空間 (ISO 用語ではTSAP ) は、TCP ポートの空間とは完全に分離されています。
サーバ
アプリケーションは、次のようにポート番号 7654 に UDP サーバーを設定できます。プログラムには、関数recvfrom()を使用して UDP データグラムを受信する無限ループが含まれています。
#include <stdio.h> #include <errno.h> #include <string.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <unistd.h> /* ソケットの close() 用 */ #include <stdlib.h>
int main ( void ) { int sock ; struct sockaddr_in sa ; char buffer [ 1024 ]; ssize_t recsize ; socklen_t fromlen ;
memset ( & sa , 0 , sizeof sa );さ。sin_family = AF_INET ;さ。sin_addr 。s_addr = htonl ( INADDR_ANY );さ。sin_port = htons ( 7654 ); fromlen = sizeof sa ;
sock = socket ( PF_INET 、SOCK_DGRAM 、IPPROTO_UDP );
if ( bind ( sock 、( struct sockaddr * ) & sa 、sizeof sa ) == -1 ) { perror ( "error bind failed" ); close ( sock ); exit ( EXIT_FAILURE ); }
for (;;) { recsize = recvfrom ( sock , ( void * ) buffer , sizeof buffer , 0 , ( struct sockaddr * ) & sa , & fromlen ); if ( recsize < 0 ) { fprintf ( stderr , "%s \n " , strerror ( errno )); exit ( EXIT_FAILURE ); } printf ( "recsize: %d \n " , ( int ) recsize ); sleep ( 1 ); printf ( "データグラム: %.*s \n " , ( int ) recsize , buffer ); } }
クライアント
以下は、ポート番号 7654 のアドレス 127.0.0.1 に文字列「Hello World!」を含む UDP パケットを送信するクライアント プログラムです。
#include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <unistd.h> #include <arpa/inet.h>
int main ( void ) { int sock ; struct sockaddr_in sa ; int bytes_sent ; char buffer [ 200 ]; strcpy ( buffer , "hello world!" ); /* UDP を使用してインターネット データグラム ソケットを作成します */ sock = socket ( PF_INET , SOCK_DGRAM , IPPROTO_UDP ); if ( sock == -1 ) { /* ソケットの初期化に失敗した場合は終了します */ printf ( "Error Creating Socket" ); exit ( EXIT_FAILURE ); } /* ソケット アドレスをゼロに設定します */ memset ( & sa , 0 , sizeof sa ); /* アドレスは IPv4 です */ sa . sin_family = AF_INET ; /* IPv4 アドレスは uint32_t です。オクテットの文字列表現を適切な値に変換します */ sa . sin_addr . s_addr = inet_addr ( "127.0.0.1" ); /* ソケットは unsigned short です。htons(x) は x がネットワーク バイト オーダーであることを確認します。ポートを 7654 に設定します */ sa . sin_port = htons ( 7654 ); bytes_sent = sendto ( sock , buffer , strlen ( buffer ), 0 ,( struct sockaddr * ) & sa , sizeof sa ); if ( bytes_sent < 0 ) { printf ( "Error sending packet: %s \n " , strerror ( errno )); exit ( EXIT_FAILURE ); } close ( sock ); /* ソケットを閉じます */ return 0 ; }
このコードでは、buffer は送信するデータへのポインターであり、buffer_length はデータのサイズを指定します。
参考文献
- ^ 例えば、Rubyプログラミング言語のruby-doc::Socket
- ^ 「— POSIX.1-2008 仕様」 Opengroup.org . 2012年7月26日閲覧。
- ^ 「Plan 9 におけるネットワークの構成」。
- ^ 「VFS プラグインとしての Linux TCP/IP スタック」。
- ^ スティーブンス&ラゴ 2013、607ページ。
- ^ POSIX.1-2004
- ^ – FreeBSDライブラリ関数マニュアル
- ^ Conill, Ariadne (2022年3月27日). 「gethostbynameの悲劇」. ariadne.space .
- ^ – FreeBSDファイルフォーマットマニュアル
- ^ https://manpages.debian.org/experimental/ax25-tools/netrom.4.en.html。
{{cite web}}:欠落または空|title=(ヘルプ) - ^ UNIX ネットワークプログラミング第 1 巻、第 3 版: ソケットネットワーク API、W. Richard Stevens、Bill Fenner、Andrew M. Rudoff、Addison Wesley、2003 年。
- ^ 「The Open Group Base Specifications Issue 7」。Pubs.opengroup.org 。 2012年7月26日閲覧。
- ^ 「TCP/IP raw ソケット - Win32 アプリ」。2022 年 1 月 19 日。
- ^ 「Beej のネットワーク プログラミング ガイド」。Beej.us。2007 年 5 月 5 日。2012年 7 月 26 日閲覧。
- ^ 「ソケットの終了」。Softlab.ntua.gr 。 2012年7月26日閲覧。
- ^ 「ntua.gr - C での UNIX ソケットのプログラミング - よくある質問: クライアントとサーバーの両方に関する質問 (TCP/SOCK_STREAM)」。Softlab.ntua.gr。2012年 7 月 26 日閲覧。
ソケット インターフェイスの 正式な標準定義は、次のように呼ばれる POSIX 標準に含まれています。
- IEEE Std. 1003.1-2001 情報技術標準 - ポータブル オペレーティング システム インターフェイス (POSIX)。
- Open Group 技術標準: 基本仕様、第 6 版、2001 年 12 月。
- ISO/IEC 9945:2002
この標準とその進行中の作業に関する情報は、オースティンの Web サイトから入手できます。
基本ソケット API への IPv6 拡張は、RFC 3493 および RFC 3542 に記載されています。
- Stevens, W. Richard; Rago, Stephen A. ( 2013年 5 月 24 日)。UNIX 環境での高度なプログラミング (第 3 版)。Addison -Wesley Professional。ISBN 978-0321637734. 2015年2月27日閲覧。
外部リンク
- UNIX プログラマー向け補足ドキュメント (PSD: 20-1)
- Beej のネットワーク プログラミング ガイド - 2007
- Berkeley Socket プログラムを Winsock に移植する - Microsoft のドキュメント。
- C 言語による UNIX ソケットのプログラミング - よくある質問 - 1996
- Linux ネットワーク プログラミング - Linux Journal、1998
