kazmax - Linux で自宅サーバー

bind - システムコールの説明 - Linux コマンド集 一覧表

  1. 名前
  2. 書式
  3. 説明
  4. 返り値
  5. エラー
  6. バグ
  7. 準拠
  8. 注意
  9. 関連項目

名前

bind - ソケットに名前をつける

書式

#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd , const struct sockaddr * my_addr ", socklen_t " addrlen );

説明

bind ()はソケット sockfd にアドレス my_addr を与える。 my_addraddrlen バイトの長さである。 伝統的にこれは 「ソケットに名前をつける」 と呼ばれる。   socket (2) でソケットが作成されたとき、 ソケットは名前空間 (アドレス・ファミリー) に存在するが、 名前はつけられていない。

通常、 SOCK_STREAM ソケットによって接続を受け入れる ( accept (2)を参照) 前に bind ()を使用してローカルアドレスを割り当てる必要がある。
名前付けのルールはアドレス・ファミリーごとに異なっている。詳細な情報は 第 7 章の各マニュアルを参照すること。 AF_INET は   ip (7) を、 AF_INET6 は   ipv6 (7) を、 AF_UNIX は   unix (7) を、 AF_APPLETALK は   ddp (7) を、 AF_PACKET は   packet (7) を、 AF_X25 は   x25 (7) を、 AF_NETLINK は   netlink (7) を参照。
my_addr 引き数に実際にどのような構造体が渡されるかは、 アドレス・ファミリーに依存する。 sockaddr 構造体は以下のような感じで定義されている:


struct sockaddr { sa_family_t sa_family; char sa_data[14]; }

この構造体は、 my_addr に渡される構造体へのポインタをキャストし、 コンパイラの警告メッセージを抑えるためだけに存在する。 具体的にどのようにすればよいのかを、 Unix ドメイン ( AF_UNIX )の場合の例として以下に示す。

#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <stdlio.h>


#define MY_SOCK_PATH "/somepath"
int main(int argc, char *argv[]) { int sfd; struct sockaddr_un addr;
sfd = socket(AF_UNIX, SOCK_STREAM, 0); if (sfd == -1) { perror("socket"); exit(EXIT_FAILURE); }
memset(&addr, 0, sizeof(struct sockaddr_un)); /* Clear structure */ addr.sun_family = AF_UNIX; strncpy(addr.sun_path, MY_SOCK_PATH, sizeof(addr.sun_path) - 1);
if (bind(sfd, (struct sockaddr *) &addr, sizeof(struct sockaddr_un)) == -1) { perror("bind"); exit(EXIT_FAILURE); } ... }

返り値

成功すると 0 を返す。 失敗すると -1 を返し、 errno に適切な値を設定する。

エラー

EACCES
そのアドレスは保護されていて、かつユーザーがスーパー・ユーザーではない。
EADDRINUSE
指定されたアドレスが既に使用中である。
EBADF
sockfd が不正なディスクリプターである。
EINVAL
ソケットがすでにアドレスに結びつけ (bind) られている。 ENOTSOCK sockfd がファイルに対するディスクリプターで、ソケットに対するものではない。

以下のエラーは UNIXドメイン ( AF_UNIX )のソケット特有である:

EACCES
パス名の構成要素に検索許可 (search permission) がない ( path_resolution (2)も参照すること)。
EADDRNOTAVAIL
存在しないインタフェースが要求されたか、要求されたアドレスが ローカルではなかった。
EFAULT
my_addr がユーザのアクセス可能なアドレス空間の外を指している。
EINVAL
addrlen が不正であるか、ソケットが AF_UNIX ファミリーではない。
ELOOP
my_addr を解決する際に遭遇したシンボリック・リンクが多過ぎる。
ENAMETOOLONG
my_addr が長過ぎる。
ENOENT
ファイルが存在しない。
ENOMEM
カーネルに、利用可能なメモリーが十分にない。
ENOTDIR
パス名の構成要素がディレクトリではない。
EROFS
ソケット inode が読み込み専用のファイルシステム上にある。

バグ

透過的プロキシ (transparent proxy) オプションについて記述していない。

準拠

SVr4, 4.4BSD ( bind ()関数は 4.2BSD で最初に現われた)。

注意

bind ()の三番目の引き数は (4.x BSD や libc4, libc5 と同様に) 実際には int である。glibc でも使われている現在の socklen_t に関して、POSIX には少し混乱がある。 詳しくは   accept (2) を参照のこと。

関連項目