バインド・サブルーチン
目的
ソケットに名前をバインドします。
ライブラリー
標準 C ライブラリー (libc.a)
構文
#include <sys/socket.h>
説明
バインド サブルーチンは、名前なしソケットに 名前 パラメーターを割り当てます。 ソケット サブルーチンによって作成されるソケットには名前が付けられません。これらのソケットは、アドレス・ファミリーによってのみ識別されます。 ソケットを接続するサブルーチンは、名前を割り当てるか、名前なしソケットを使用します。
ユニックスドメインソケットの場合、'コネクト呼び出しは、'コネクト呼び出しを行ったプロセスが 'バインド呼び出しで作成されたソケットファイルの読み取り権限と書き込み権限を持っている場合にのみ成功する。 許可は、ファイルを作成したプロセスの Umask 値によって決定されます。
アプリケーション・プログラムは、 getsockname サブルーチンを使用して、割り当てられたソケット名を検索することができます。
ソケット・アプリケーションは、 COMPAT_43 を定義してコンパイルすることができます。 これにより、 sockaddr 構造体 BSD 4.3 は互換になります。 詳しくは、 socket.h ファイルを参照してください。
UNIX ドメインに名前をバインドすると、ファイル・システムにソケットが作成されます。このソケットは、呼び出し元が不要になったときに削除する必要があります。
パラメーター
| 項目 | 説明 |
|---|---|
| ソケット | バインドするソケットのソケット記述子 (整数) を指定します。 |
| 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));