名 前
bind − ソ ケ ッ ト に 名 前 を つ け る
書 式
#include
<sys/types.h> /* 「 注 意
」 参 照 */
#include <sys/socket.h>
int
bind(int sockfd, const struct sockaddr
*addr,
socklen_t addrlen);
説 明
socket(2) で ソ ケ ッ ト が 作 成 さ れ た と き 、 そ の ソ ケ ッ ト は 名 前 空 間 (ア ド レ ス フ ァ ミ リ ー ) に 存 在 す る が 、 ア ド レ ス は 割 り 当 て ら れ て い な い 。 bind() は 、 フ ァ イ ル デ ィ ス ク リ プ タ ー sockfd で 参 照 さ れ る ソ ケ ッ ト に addr で 指 定 さ れ た ア ド レ ス を 割 り 当 て る 。 addrlen に は addr が 指 す ア ド レ ス 構 造 体 の サ イ ズ を バ イ ト 単 位 で 指 定 す る 。 伝 統 的 に こ の 操 作 は 「 ソ ケ ッ ト に 名 前 を つ け る 」 と 呼 ば れ る 。
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) を 参 照 。
addr 引 き 数 に 実 際 に ど の よ う な 構 造 体 が 渡 さ れ る か は 、 ア ド レ ス フ ァ ミ リ ー に 依 存 す る 。 sockaddr 構 造 体 は 以 下 の よ う な 感 じ で 定 義 さ れ て い る :
struct sockaddr
{
sa_family_t sa_family;
char sa_data[14]; } こ の 構 造
体 は 、 addr に 渡
さ れ る 構 造 体
へ の ポ イ ン タ
ー を キ ャ ス ト
し 、 コ ン パ イ
ラ の 警 告 メ ッ
セ ー ジ を 抑 え
る た め だ け に
存 在 す る 。 下
記 の 「 例 」 を
参 照 。
返 り 値
成 功 し た 場 合 に は ゼ ロ が 返 さ れ る 。 エ ラ ー 時 に は −1 が 返 さ れ 、 errno が 適 切 に 設 定 さ れ る 。
エ ラ ー
EACCES そ の ア ド レ ス は 保 護 さ れ て い て 、 か つ ユ ー ザ ー が ス ー パ ー ユ ー ザ ー で は な い 。 |
EADDRINUSE 指
定 さ れ た ア ド
レ ス が 既 に 使
用 中 で あ る 。
EADDRINUSE
(イ ン タ ー ネ ッ ト ド メ イ ン ソ ケ ッ ト の 場 合 ) ソ ケ ッ ト ア ド レ ス 構 造 体 で ポ ー ト 番 号 に 0 が 指 定 さ れ た が 、 一 時 ポ ー ト (ephemeral port) を 割 り 当 て よ う と し た 際 に 、 一 時 ポ ー ト と し て 使 用 す る 範 囲 の す べ て の ポ ー ト 番 号 が 使 用 中 で あ っ た 。 ip(7) の /proc/sys/net/ipv4/ip_local_port_range の 説 明 を 参 照 。
EBADF |
sockfd が 不 正 な デ ィ ス ク リ プ タ ー で あ る 。
ソ ケ ッ
ト が す で に ア
ド レ ス に 結 び
つ け (bind) ら れ て い
る 。 addrlen が 間 違 っ て い る か 、 addr が こ の ソ ケ ッ ト の ド メ イ ン で 有 効 な ア ド レ ス で は な い 。 ENOTSOCK sockfd が フ ァ イ ル に 対 す る デ ィ ス ク リ プ タ ー で 、 ソ ケ ッ ト に 対 す る も の で は な い 。 以 下 の エ ラ ー は UNIXド メ イ ン (AF_UNIX) の ソ ケ ッ ト 特 有 で あ る :
(path_resolution(7) も 参 照 す る こ と )。 EADDRNOTAVAIL 存 在 し な い イ ン タ ー フ ェ ー ス が 要 求 さ れ た か 、 要 求 さ れ た ア ド レ ス が ロ ー カ ル で は な か っ た 。
ENAMETOOLONG addr が 長 過 ぎ る 。
ENOTDIR パ ス 名 の 構 成 要 素 が デ ィ レ ク ト リ で は な い 。
準 拠SVr4, 4.4BSD, POSIX.1−2001 (bind() は 4.2BSD で 最 初 に 現 わ れ た )。 注 意POSIX.1−2001 で は <sys/types.h> の イ ン ク ル ー ド は 必 須 と さ れ て お ら ず 、 Linux で は こ の ヘ ッ ダ ー フ ァ イ ル は 必 要 で は な い 。 し か し 、 歴 史 的 に は 、 い く つ か の 実 装 (BSD 系 ) で こ の ヘ ッ ダ ー フ ァ イ ル が 必 要 で あ り 、 移 植 性 が 必 要 な ア プ リ ケ ー シ ョ ン で は こ の フ ァ イ ル を イ ン ク ル ー ド す る の が 賢 明 で あ ろ う 。 bind() の 三 番 目 の 引 き 数 は (4.x BSD や libc4, libc5 と 同 様 に ) 実 際 に は int で あ る 。 glibc で も 使 わ れ て い る 現 在 の socklen_t に 関 し て 、 POSIX に は 少 し 混 乱 が あ る 。 詳 し く は accept(2) を 参 照 の こ と 。 バ グ透 過 的 プ ロ キ シ (transparent proxy) オ プ シ ョ ン に つ い て 記 述 し て い な い 。 例イ ン タ ー ネ ッ ト ド メ イ ン ソ ケ ッ ト で の bind() の 利 用 例 が getaddrinfo(3) に 記 載 さ れ て い る 。 以 下 の 例 は 、 UNIX ド メ イ ン (AF_UNIX) で ス ト リ ー ム ソ ケ ッ ト を bind す る 方 法 を 示 し た も の で あ る 。 #include
<sys/socket.h> #define
MY_SOCK_PATH "/somepath" #define
handle_error(msg) \ int sfd =
socket(AF_UNIX, SOCK_STREAM, 0); memset(&my_addr,
0, sizeof(struct sockaddr_un)); if (bind(sfd,
(struct sockaddr *) &my_addr, if (listen(sfd,
LISTEN_BACKLOG) == −1) /* Now we can
accept incoming connections one peer_addr_size
= sizeof(struct sockaddr_un); /* Code to deal with incoming connection(s)... */ /* When no
longer required, the socket pathname, MY_SOCK_PATH 関 連 項 目accept(2), connect(2), getsockname(2), listen(2), socket(2), getaddrinfo(3), getifaddrs(3), ip(7), ipv6(7), path_resolution(7), socket(7), unix(7) こ の 文 書 に つ い てこ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。 |