BINDRESVPORT(3)

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

書式
#include <rpc/rpc.h> int bindresvport(int sd, struct sockaddr_in *sin) int bindresvport_sa(int sd, struct sockaddr *sa)

解説
bindresvport と bindresvport_sa は、ソケット記述子を、特権 IP ポート、すなわち範囲 0 〜 1023 のポートに結合するために使用されます。

ルートだけが特権ポートに結合できます。この呼び出しは他のユーザについては 処理失敗します。

sin がヌルポインタでない場合、 sin->sin_family は sd によって渡されるソケットのアドレスファミリで初期化する 必要があります。 sin->sin_port の値がゼロでない場合、 bindresvport() は、指定したポートを使用しようとします。 それに失敗すると、別の特権付きポートを自動的に選択します。

sin にヌルポインタを渡すことは正当です。 この場合、呼び出し側は bindresvport() が拾ったポート番号を得ることができません。

bindresvport() の関数プロトタイプは、 AF_INET ソケットに特化しています。 bindresvport_sa() は、より中立的な関数プロトタイプを持ちますが、 正確に同じように動作します。両方の関数とも 正確に同じ挙動を示すことと、両方とも AF_INET ソケットと同様に、 AF_INET6 ソケットをサポートすることに注意してください。

戻り値
bindresvport() と bindresvport_sa() は、処理が成功したら値 0 を返します。そうでない場合は -1 が返され、 エラーを示すために errno が設定されます。

エラー
bindresvport() と bindresvport_sa() 関数は次の場合に失敗します。

[EBADF]
    sd が有効な記述子ではありません。

[ENOTSOCK]
    sd はソケットではありません。

[EADDRNOTAVAIL]
    指定されたアドレスはこのローカルマシンから利用可能ではありません。

[EADDRINUSE]
    指定されたアドレスはすでに使用中です。

[EINVAL]
    ソケットはすでにあるアドレスにバインドされています、または、 ソケットファミリと指定されたアドレスのファミリとが一致しません。

[EACCES]
    要求されたアドレスは保護されており、現在のユーザは、そこに アクセスするには不適切なパーミッションを持っています。

[EFAULT]
    name パラメータは、ユーザアドレス空間の正当な部分に存在しません。

[ENOBUFS]
    システムには、この操作を実行するために十分な資源がありません。

[EPFNOSUPPORT]
    システムにプロトコルファミリが設定されていないか、 プロトコルファミリに対する実装が存在しないか、 引数の間でアドレスファミリが一致しません。

関連項目
bind(2), socket(2), rresvport(3), rresvport_af(3)