システムプログラム(第6回): ソケットAPI

                                       筑波大学 システム情報系 情報工学域
                                       新城 靖
                                       <yas@cs.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~syspro/2022/2022-06-29/socket-api.html
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~syspro/2022/
http://www.coins.tsukuba.ac.jp/~yas/

ソケットAPI

Unix 系のオペレーティング・システム上でTCP/IPを使うプログラムを開発する には、ソケットAPIを用いる。ソケットは、TCP/IP をはじめとして、XNS, OSI などさまざまな通信プロトコルを UNIX オペレーティング・システム上で使う ために設計されたものである。TCP/IP だけを考えると、ソケットAPI は、繁雑 であり、使いにくくなっている。

UNIXでは、ソケットをドメイン(Protocol Family)と型で区別する。 下の表は、socket() システム・コールに与えるドメインと型である。

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 システム・コールで指定しても、うまくいかない。

ソケットAPIの主要なシステムコール(またはライブラリ関数)
名前 説明
socket() 通信プロトコルに対応したソケット・オブジェクトを作成する
connect() 結合(conection)を確立させる。サーバのアドレスを固定する。
listen() サーバ側で接続要求の待ち受けを開始する。
accept() サーバ側で接続されたソケットを得る。
bind() ソケットにアドレス(名前)を付ける。
getpeername() 通信相手のアドレス(名前)を得る。
getsockname() 自分のアドレス(名前)を得る。
send(),sendto(),sendmsg() メッセージを送信する。
recv(),recvfrom(),recvmsg() メッセージを受信する。
shutdown() 双方向の結合を部分的に切断する。
getsockopt() オプションの現在の値を取得する。
setsockopt() オプションを設定する。
select(), poll() 複数の入出力(通信を含む)を多重化する。
write() メッセージを送信する。ファイルと共通。
read() メッセージを受信する。ファイルと共通。
close() ファイル記述子(ファイルディスクリプタ)を閉じる。他に参照しているファイル記述子が なければ、ソケット・オブジェクトを削除する。ファイルと共通。


Last updated: 2022/06/07 15:57:26
Yasushi Shinjo / <yas@cs.tsukuba.ac.jp>