Man page - bind(2)

Packages contains this manual

Available languages:

en fr es pl tr ja ru zh_TW zh_CN de

Manual

BIND

名 前
書 式
説 明
返 り 値
エ ラ ー
準 拠
注 意
バ グ

関 連 項 目
こ の 文 書 に つ い て

名 前

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 が 有 効 な フ ァ イ ル デ ィ ス ク リ プ タ ー で な い 。

EINVAL

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

EINVAL

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

ENOTSOCK

フ ァ イ ル デ ィ ス ク リ プ タ ー sockfd が ソ ケ ッ ト を 参 照 し て い な い 。

以 下 の エ ラ ー は UNIXド メ イ ン ( AF_UNIX ) の ソ ケ ッ ト 特 有 で あ る :

EACCES

パ ス 名 の 構 成 要 素 に 検 索 許 可 (search permission) が な い ( path_resolution (7) も 参 照 す る こ と )。

EADDRNOTAVAIL

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

EFAULT

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

ELOOP

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

ENAMETOOLONG

addr が 長 過 ぎ る 。

ENOENT

A component in the directory prefix of the socket pathname does not exist.

ENOMEM

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

ENOTDIR

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

EROFS

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

準 拠

accept (): POSIX.1-2001, POSIX.1-2008, SVr4, 4.4BSD, ( bind () は 4.2BSD で 初 め て 実 装 さ れ た ).

注 意

POSIX.1 で は <sys/types.h> の イ ン ク ル ー ド は 必 須 と さ れ て お ら ず 、 Linux で は こ の ヘ ッ ダ ー フ ァ イ ル は 必 要 で は な い 。 し か し 、 歴 史 的 に は 、 い く つ か の 実 装 (BSD 系 ) で こ の ヘ ッ ダ ー フ ァ イ ル が 必 要 で あ り 、 移 植 性 が 必 要 な ア プ リ ケ ー シ ョ ン で は こ の フ ァ イ ル を イ ン ク ル ー ド す る の が 賢 明 で あ ろ う 。

For background on the socklen_t type, see 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(my_addr));
/* 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(my_addr)) == -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(peer_addr);
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 プ ロ ジ ェ ク ト の リ リ ー ス 5.10 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は https://www.kernel.org/doc/man-pages/ に 書 か れ て い る 。