バインド・サブルーチン

目的

ソケットに名前をバインドします。

ライブラリー

標準 C ライブラリー (libc.a)

構文

#include <sys/socket.h>
int bind ( Socket,  Name,  NameLength)
int Socket;
const struct sockaddr *Name;
socklen_t NameLength;

説明

バインド サブルーチンは、名前なしソケットに 名前 パラメーターを割り当てます。 ソケット サブルーチンによって作成されるソケットには名前が付けられません。これらのソケットは、アドレス・ファミリーによってのみ識別されます。 ソケットを接続するサブルーチンは、名前を割り当てるか、名前なしソケットを使用します。

ユニックスドメインソケットの場合、'コネクト呼び出しは、'コネクト呼び出しを行ったプロセスが 'バインド呼び出しで作成されたソケットファイルの読み取り権限と書き込み権限を持っている場合にのみ成功する。 許可は、ファイルを作成したプロセスの Umask 値によって決定されます。

アプリケーション・プログラムは、 getsockname サブルーチンを使用して、割り当てられたソケット名を検索することができます。

ソケット・アプリケーションは、 COMPAT_43 を定義してコンパイルすることができます。 これにより、 sockaddr 構造体 BSD 4.3 は互換になります。 詳しくは、 socket.h ファイルを参照してください。

UNIX ドメインに名前をバインドすると、ファイル・システムにソケットが作成されます。このソケットは、呼び出し元が不要になったときに削除する必要があります。

注: アプリケーションに対して IPv6 を有効にすると、 IPv4 アドレスもサポートされます。 AF_INET6 ソケットを使用すると、 IPv4 と IPv6 の両方のパケットを送受信できます。これは、 AF_INET6 ソケットが IPv4 と IPv6 の両方のホストとの通信を処理できるためです。 ただし、以前にソケット呼び出しに渡された IPv4 アドレスのアドレス・フォーマットを IPv4-mapped IPv6 アドレス・フォーマットに変換する必要があります。 例えば、 sockaddr_in 構造体の 10.1.1.1 を sockaddr_in6 構造体の ::ffff:10.1.1.1 に変換する必要があります。

パラメーター

項目 説明
ソケット バインドするソケットのソケット記述子 (整数) を指定します。
Name ソケットがバインドされるアドレスを指定するアドレス構造体を指します。 /usr/include/sys/socket.h ファイルは、 sockaddr アドレス構造を定義します。 Sockaddr 構造体には、 ソケット サブルーチンで提供されるアドレス・フォーマットおよびプロトコルに固有の ID が含まれています。
NameLength ソケット・アドレス構造体の長さを指定します。

戻り値

正常終了すると、 バインド サブルーチンは値 0 を戻します。

バインド サブルーチンが失敗すると、サブルーチン・ハンドラーは以下のアクションを実行します。

  • 呼び出し元のプログラムに-1を返す。
  • 特定のエラーを示すエラー・コードを エラー番号 グローバル変数に移動します。 エラー番号 変数の詳細については、「 コミュニケーション・プログラミングの概念」の「エラー通知オブジェクト・クラス」を参照してください。

エラー・コード

以下のいずれかのエラーが発生すると、 バインド サブルーチンは失敗します。

説明
EACCES 要求されたアドレスは保護されていますが、現在のユーザーにはそのアドレスにアクセスする権限がありません。
EADDRINUSE 指定されたアドレスは、既に使用されています。
EADDRNOTAVAIL 指定のアドレスは、ローカル・マシンからは 利用できません。
EAFNOSUPPORT 指定されたアドレスは、指定されたソケットのアドレス・ファミリーの有効なアドレスではありません。
EAGAIN 一時ポートは既に使用中であり、使用できません。
EBADF ソケット パラメーターが有効ではありません。
EDESTADDRREQ アドレス 引数が NULL ポインターです。
EFAULT Address パラメーターは UserAddress スペースの書き込み可能部分にはありません。
EINVAL ソケットは既にアドレスにバインドされています。
エノブフ 使用できる十分なバッファー・スペースがありません。
ENODEV 指定されたデバイスは存在しません。
ENOTSOCK ソケット パラメーターは、ソケットではなくファイルを参照します。
EOPNOTSUPP ソケット パラメーターによって参照されるソケットは、アドレス・バインディングをサポートしません。

以下のプログラム・フラグメントは、 バインド サブルーチンを使用して名前をバインドする方法を示しています。/tmp/zan/UNIX ドメイン・ソケットに送信します。

#include <sys/un.h>
.
.
.
struct sockaddr_un addr;
.
.
.
strcpy(addr.sun_path, "/tmp/zan/");
addr.sun_len = strlen(addr.sun_path);
addr.sun_family = AF_UNIX; 
bind(s,(struct sockaddr*)&addr, SUN_LEN(&addr));