bind - システムコールの説明 - Linux コマンド集 一覧表
名前
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_addr は addrlen バイトの長さである。 伝統的にこれは 「ソケットに名前をつける」 と呼ばれる。 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) を参照のこと。