筑波大学 システム情報系 情報工学域
                                       新城 靖
                                       <yas@cs.tsukuba.ac.jp>
このページは、次の URL にあります。
	https://www.coins.tsukuba.ac.jp/~syspro/2024/2024-07-03/socket-api.html
あるいは、次のページから手繰っていくこともできます。
	https://www.coins.tsukuba.ac.jp/~syspro/2024/
	http://www.coins.tsukuba.ac.jp/~yas/
Unix 系のオペレーティング・システム上でTCP/IPを使うプログラムを開発する には、ソケットAPIを用いる。ソケットは、TCP/IP をはじめとして、XNS, OSI などさまざまな通信プロトコルを UNIX オペレーティング・システム上で使う ために設計されたものである。TCP/IP だけを考えると、ソケットAPI は、繁雑 であり、使いにくくなっている。
UNIXでは、ソケットをドメイン(Protocol Family)と型で区別する。 下の表は、socket() システム・コールに与えるドメインと型である。
| ドメイン | 型 | option | プロトコル | 
|---|---|---|---|
| PF_INET | SOCK_STREAM | 0 | TCP/IP | 
| PF_INET | SOCK_DGRAM | 0 | UDP/IP | 
| PF_INET | SOCK_RAW | ? | IP,ICMPなど | 
| PF_INET6 | SOCK_STREAM | 0 | TCP/IP(IPv6) | 
| PF_INET6 | SOCK_DGRAM | 0 | UDP/IP(IPv6) | 
| PF_UNIX | SOCK_STREAM | 0 | 同一ホスト内(Unixドメイン)のストリーム | 
| PF_UNIX | SOCK_DGRAM | 0 | 同一ホスト内(Unixドメイン)のデータグラム | 
| PF_NS | SOCK_STREAM | ? | Xerox Network Systems protocol のストリーム(SPP) | 
| PF_NS | SOCK_SEQPACKET | ? | Xerox Network Systems protocol の順序付きパケット | 
| PF_NS | SOCK_RDM | ? | Xerox Network Systems protocol の信頼性のあるデータグラム | 
これ以外の組み合わせ、使えない。たとえば、PF_INETとSOCK_SEQPACKET を socket システム・コールで指定しても、うまくいかない。
| 名前 | 説明 | 
|---|---|
| socket() | 通信プロトコルに対応したソケット・オブジェクトを作成する | 
| connect() | 結合(conection)を確立させる。サーバのアドレスを固定する。 | 
| listen() | サーバ側で接続要求の待ち受けを開始する。 | 
| accept() | サーバ側で接続されたソケットを得る。 | 
| bind() | ソケットにアドレス(名前)を付ける。 | 
| getpeername() | 通信相手のアドレス(名前)を得る。 | 
| getsockname() | 自分のアドレス(名前)を得る。 | 
| send(),sendto(),sendmsg() | メッセージを送信する。 | 
| recv(),recvfrom(),recvmsg() | メッセージを受信する。 | 
| shutdown() | 双方向の結合を部分的に切断する。 | 
| getsockopt() | オプションの現在の値を取得する。 | 
| setsockopt() | オプションを設定する。 | 
| select(), poll() | 複数の入出力(通信を含む)を多重化する。 | 
| write() | メッセージを送信する。ファイルと共通。 | 
| read() | メッセージを受信する。ファイルと共通。 | 
| close() | ファイル記述子(ファイルディスクリプタ)を閉じる。他に参照しているファイル記述子が なければ、ソケット・オブジェクトを削除する。ファイルと共通。 |