名前
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];
}
#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.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 が読み込み専用のファイルシステム上にある。 |
準拠
SVr4, 4.4BSD, POSIX.1-2001 (bind() 関数は 4.2BSD で最初に現われた)。
注意
bind() の三番目の引き数は (4.x BSD や libc4, libc5 と同様に) 実際には int である。glibc でも使われている現在の socklen_t に関して、POSIX には少し混乱がある。 詳しくは accept(2) を参照のこと。
バグ
透過的プロキシ (transparent proxy) オプションについて記述していない。
関連項目
accept(2), connect(2), getsockname(2), listen(2), path_resolution(2), socket(2), getaddrinfo(3), ip(7), ipv6(7), socket(7), unix(7)