Manpages

名 前

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_INETip(7) を 、 AF_INET6ipv6(7) を 、 AF_UNIXunix(7) を 、 AF_APPLETALKddp(7) を 、 AF_PACKETpacket(7) を 、 AF_X25x25(7) を 、 AF_NETLINKnetlink(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 が 不 正 な デ ィ ス ク リ プ タ ー で あ る 。

EINVAL

ソ ケ ッ ト が す で に ア ド レ ス に 結 び つ け (bind) ら れ て い る 。
EINVAL

addrlen が 間 違 っ て い る か 、 addr が こ の ソ ケ ッ ト の ド メ イ ン で 有 効 な ア ド レ ス で は な い 。

ENOTSOCK

sockfd が フ ァ イ ル に 対 す る デ ィ ス ク リ プ タ ー で 、 ソ ケ ッ ト に 対 す る も の で は な い 。 以 下 の エ ラ ー は UNIXド メ イ ン (AF_UNIX) の ソ ケ ッ ト 特 有 で あ る :

EACCES パ ス 名 の 構 成 要 素 に 検 索 許 可

(search permission) が な い

(path_resolution(7) も 参 照 す る こ と )。

EADDRNOTAVAIL 存 在 し な い イ ン タ ー フ ェ ー ス が 要 求 さ れ た か 、 要 求 さ れ た ア ド レ ス が ロ ー カ ル で は な か っ た 。

EFAULT

addr が ユ ー ザ ー の ア ク セ ス 可 能 な ア ド レ ス 空 間 の 外 を 指 し て い る 。

ELOOP

addr を 解 決 す る 際 に 遭 遇 し た シ ン ボ リ ッ ク リ ン ク が 多 過 ぎ る 。

ENAMETOOLONG

addr が 長 過 ぎ る 。

ENOENT フ ァ イ ル が 存 在 し な い 。

ENOMEM カ ー ネ ル に 、 利 用 可 能 な メ モ リ ー が 十 分 に な い 。

ENOTDIR パ ス 名 の 構 成 要 素 が デ ィ レ ク ト リ で は な い 。

EROFS ソ ケ ッ ト

inode が 読 み 込 み 専 用 の フ ァ イ ル シ ス テ ム 上 に あ る 。

準 拠

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>
#include <sys/un.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define MY_SOCK_PATH "/somepath"
#define LISTEN_BACKLOG 50

#define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while (0)

int
main(int argc, char *argv[])
{
int sfd, cfd;
struct sockaddr_un my_addr, peer_addr;
socklen_t peer_addr_size;

sfd = socket(AF_UNIX, SOCK_STREAM, 0);
if (sfd == −1)
handle_error("socket");

memset(&my_addr, 0, sizeof(struct sockaddr_un));
/* Clear structure */
my_addr.sun_family = AF_UNIX;
strncpy(my_addr.sun_path, MY_SOCK_PATH,
sizeof(my_addr.sun_path) − 1);

if (bind(sfd, (struct sockaddr *) &my_addr,
sizeof(struct sockaddr_un)) == −1)
handle_error("bind");

if (listen(sfd, LISTEN_BACKLOG) == −1)
handle_error("listen");

/* Now we can accept incoming connections one
at a time using accept(2) */

peer_addr_size = sizeof(struct sockaddr_un);
cfd = accept(sfd, (struct sockaddr *) &peer_addr,
&peer_addr_size)
if (cfd == −1)
handle_error("accept");

/* Code to deal with incoming connection(s)... */

/* When no longer required, the socket pathname, MY_SOCK_PATH
should be deleted using unlink(2) or remove(3) */ }

関 連 項 目

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/ に 書 か れ て い る 。