EN JA
SOCKET(2)
SOCKET(2) FreeBSD System Calls Manual SOCKET(2)

名称

socket通信のためのエンドポイントを作成する

ライブラリ

Standard C Library (libc, -lc)

書式

#include < sys/types.h>
#include < sys/socket.h>

int
socket( int domain, int type, int protocol);

解説

socket() システムコールは、通信のエンドポイントを作成し、記述子を返します。

domain 引数では、通信を行う通信ドメインを指定します。これにより、使用するプロトコルファミリが選択されます。これらのファミリは、インクルードファイル < sys/socket.h> で定義されています。現在解釈される形式は、次の通りです:

PF_LOCAL        PF_UNIX と呼ばれていた、ホスト内プロトコル 
PF_UNIX         ホスト内プロトコル、使用は奨励されない。 
                PF_LOCAL を使用のこと 
PF_INET         IPv4 プロトコル 
PF_PUP          BSP のような PUP プロトコル 
PF_APPLETALK    AppleTalk プロトコル 
PF_ROUTE        内部ルーティングプロトコル 
PF_LINK         リンク層インタフェース 
PF_IPX          Novell 社 IPX (Internet Packet eXchange) プロトコル 
PF_RTIP         RTIP パケットの識別に使用 
PF_PIP          PIP パケットの識別に使用 
PF_ISDN         統合デジタル通信サービス網 (ISDN) 
PF_KEY          内部鍵管理機能 
PF_INET6        IPv6 プロトコル 
PF_NATM         ATM へのネイティブアクセス 
PF_ATM          ATM 
PF_NETGRAPH     Netgraph ソケット

ソケットには、通信のセマンティックを指定する type があります。現在、定義されているタイプは、次の通りです:

SOCK_STREAM     ストリームソケット 
SOCK_DGRAM      データグラムソケット 
SOCK_RAW        生プロトコルインタフェース 
SOCK_RDM        伝達が信頼できるパケット 
SOCK_RDM        確実に配信されるパケット 
SOCK_SEQPACKET  順序付けられたパケットストリーム

SOCK_STREAM タイプは、連続した、信頼性のある、双方向接続ベースのバイトストリームを提供します。帯域外データ転送メカニズムがサポートされることもあります。 SOCK_DGRAM ソケットでは、データグラム (コネクションレスで信頼性のない、最大長が固定の (一般的には小さい) メッセージ) がサポートされます。 SOCK_SEQPACKET ソケットは、連続した、信頼性のある、双方向接続ベースの最大長が固定のデータグラムの転送を提供します。各読み込みシステムコールでパケット全体を読み込む必要があるかもしれません。この機能は、プロトコル固有のもので、現在のところ実装されていません。 SOCK_RAW ソケットでは、内部ネットワークプロトコルとインタフェースにアクセスできます。スーパユーザしか使用できない SOCK_RAW タイプ、および計画されているがまだ実装されていない SOCK_RDM については、ここでは、説明しません。

さらに、次のフラグは、 type 引数で許可されます:

SOCK_CLOEXEC 新しい記述子で close-on-exec を設定する 
SOCK_NONBLOCK 新しいソケットで non-blocking モードを設定する

protocol 引数では、ソケットで使用する特定プロトコルを指定します。通常の場合は、1 つのプロトコルのみが存在して、指定したプロトコルファミリの特定ソケットタイプをサポートします。しかし、複数のプロトコルが存在することも可能です。この場合は、特定プロトコルをこの方法で指定する必要があります。使用するプロトコル番号は、通信を行う“通信ドメイン”に固有です。 protocols(5) を参照してください。

protocol 引数は、もしあれば、プロトコルのためのソケットタイプのデフォルト実装を要求するために、0 の設定されます。

タイプ SOCK_STREAM のソケットは、パイプに類似した全二重バイトストリームです。ストリームソケットでは、 接続済み状態 にしてからデータを送受信する必要があります。別のソケットへの接続は、 connect(2) システムコールを呼び出して作成できます。接続されたら、 read(2)write(2) を呼び出すか、 send(2)recv(2) 関数の変種を呼び出してデータを転送できます。 (インターネットファミリなど、一部のプロトコルファミリでは、“暗黙接続”という観念がサポートされています。この接続では、 sendto(2) システムコールを呼び出し、接続オペレーションに乗せてデータを送信できます。) セッションが終了したら、 close(2) を実行しても構いません。帯域外データは、 send(2) で説明されているように送信し、 recv(2) で説明されているように受信できます。

SOCK_STREAM の実装に使用する通信プロトコルでは、データの喪失や重複がないことを確実にします。ピアプロトコルにバッファ空間があるデータの一部を合理的な時間内に問題なく転送できない場合は、接続が破損したとみなされて呼び出しがエラーとなり、-1 が戻されてグローバル変数 errnoETIMEDOUT が設定されます。その他の動作がない場合、プロトコルは、約 1 分ごとに転送を強制し、ソケットの“接続”を任意に維持します。一定期間 (例えば、5 分間) アイドル接続で応答がない場合は、エラーとなります。デフォルトで、プロセスが破損したストリームで送信するなら、 SIGPIPE シグナルが発生しますが、この振る舞いは、 setsockopt(2) を通して抑制されます。

SOCK_SEQPACKET ソケットは、 SOCK_STREAM ソケットとほぼ同じシステムコールです。 read(2) を呼び出しても、要求された量のデータしか戻されず、受信パケットの残りの部分は、放棄される点のみが異なります。

SOCK_DGRAM ソケットと SOCK_RAW ソケットでは、 send(2) の呼び出しで指定された通信相手にデータグラムを送信できます。一般的にデータグラムは、次のデータグラムのアドレスを戻す recvfrom(2) で受信されます。

fcntl(2) システムコールは、帯域外データを受信した場合の SIGURG シグナルを受信するプロセスグループを指定できます。非ブロッキング入出力、および入出力イベントの非同期通知も、 SIGIO で有効にできます。

ソケットのオペレーションは、ソケットレベルの オプション で制御されます。このオプションは、ファイル < sys/socket.h> に定義されています。 setsockopt(2) システムコールは、オプションの設定に、 getsockopt(2) システムコールは、オプションの入手に使用します。

戻り値

エラーが発生すると -1 が戻されます。エラーが発生しなかった場合は、ソケットを参照する記述子が戻されます。

エラー

socket() システムコールは、は、次の場合に失敗します:
[ EACCES]
指定されたタイプおよびプロトコルのソケットを作成するパーミッションが拒否されています。
[ EAFNOSUPPORT]
アドレスファミリ (ドメイン) が、サポートされていません、または指定されたドメインが、このプロトコルファミリによってサポートされていません。
[ EMFILE]
プロセスごとの記述子テーブルが満杯です。
[ ENFILE]
システムファイルテーブルが満杯です。
[ ENOBUFS]
バッファ空間が不足しています。充分なリソースが解放されるまでソケットを作成できません。
[ EPERM]
ユーザには、要求された操作を実行するだけの十分な特権がありません。
[ EPROTONOSUPPORT]
プロトコルタイプまたは指定されたプロトコルが、このドメイン内でサポートされていません。
[ EPROTOTYPE]
ソケットタイプが、プロトコルによってサポートされていません。

関連項目

accept(2), bind(2), connect(2), getpeername(2), getsockname(2), getsockopt(2), ioctl(2), listen(2), read(2), recv(2), select(2), send(2), shutdown(2), socketpair(2), write(2), getprotoent(3), netgraph(4), protocols(5) An Introductory 4.3 BSD Interprocess Communication Tutorial, PS1, 7. BSD Interprocess Communication Tutorial, PS1, 8.

歴史

socket() システムコールは、 4.2BSD で登場しました。
March 19, 2013 FreeBSD