bind - システムコールの説明 - Linux コマンド集 一覧表
- 名前
- 書式
- 説明
- 返り値
- エラー
- バグ
- 準拠
- 注意
- 関連項目
名前
書式
#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) を参照のこと。
関連項目
accept
(2),
connect
(2),
getsockname
(2),
listen
(2),
path_resolution
(2),
socket
(2),
getaddrinfo
(3),
ip
(7),
ipv6
(7),
socket
(7),
unix
(7)
- Linux Tips 関連記事
- Linux Tips(目次)
- Linux ディストリビューション一覧
- rpm のファイル名にあるi386とかi686とは
- 自分のマシンの情報を調べる
- cron の設定
- ssh の root ログインを禁止する
- ssh を、ユーザ、IPでアクセス制限
- 鍵交換方式によるssh接続
- 鍵交換方式によるssh接続( windowsから )
- 複数ファイル内の文字列を置換して上書き保存する
- あるグループをイニシャルグループとするユーザー一覧出力
- 複数ファイルのファイル名を一括変換する
- 連番ファイルをコマンド一発で作成する
- 中身がランダムなファイルを任意のサイズで作成する
- Linux ユーザーアカウントをロック・アンロックする