SIMPLE SOLUTIONS

BINDRESVPORT(3) - Linux manual

ソケットを特権 IP ポートにバインドする.

2013-06-21
BINDRESVPORT(3) Linux Programmer's Manual BINDRESVPORT(3)

bindresvport - ソケットを特権 IP ポートにバインドする

#include <sys/types.h> #include <netinet/in.h> int bindresvport(int sockfd, struct sockaddr_in *sin);

bindresvport() は、ソケットディスクリプターを特権無名 (privileged anonymous) IP ポートに バインドするのに使う。特権無名 IP ポートとは、 ポート番号が 512 から 1023 の範囲から任意に選択されるポートである。 bindresvport() によって実行された bind(2) が成功し、 sin が NULL 以外の場合、実際に割り当てられたポート番号が sin->sin_port に入れて返される。 sin には NULL を指定することもでき、その場合には sin->sin_family は暗黙のうちに AF_INET とみなされる。 しかし、この場合には、 bindresvport() は実際に割り当てられたポート番号を返す手段を持たない (割り当てられたポート番号は、後で getsockname(2) を使って取得できる)。

bindresvport() は成功すると 0 を返す。それ以外の場合、-1 を返し、 errno にエラーの原因を示す値を設定する。

bindresvport() は bind(2) と同じ原因で失敗する可能性がある。 さらに、以下のエラーが発生することがある: EACCES 呼び出し元がスーパーユーザーの特権を持っていなかった (より正確に言うと、 CAP_NET_BIND_SERVICE ケーパビリティが必要である)。 EADDRINUSE 全ての特権ポートが使用中である。 EAFNOSUPPORT (glibc 2.7 以前では EPFNOSUPPORT) sin が NULL 以外で、かつ sin->sin_family が AF_INET でなかった。

マ glibc 2.17 より前のバージョンでは、 bindresvport() 関数は保護されていない静的変数を使用しているため、スレッドセーフではない。 glibc 2.17 以降では、 bindresvport() 関数は静的変数を保護するロックを使っており、スレッドセーフである。

POSIX.1-2001 にはない。 BSD, Solaris およびその他の多くのシステムに存在する。

bindresvport() のいくつかの実装と異なり、glibc の実装では呼び出し元が sin->sin_port で渡した値はどんな値であっても無視される。

bind(2), getsockname(2)

この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
2013-06-21 BINDRESVPORT(3)
bindresvport(3).txt (日本語 / Japanese)
Index English version of bindresvport(3)
Go top