connect または listen 関数呼び出しの続くの前に、
bind 関数は無関係のソケット上にて使用されます。
それは、接続志向(ストリーム) または コネクションレス(データグラム) ソケットに付くのに使用されます。
socket 関数呼び出しにてソケットが作成される時、
名前空間(アドレスファミリィ)に存在していますが、しかし、名前を全くそれに割り当てません。
bind 関数を使用して、ローカル名を無名ソケットに割り当てることによって、ソケットのローカルの協会を証明してください。
インターネット・アドレスファミリィを使用するとき、名前は3つの部品から成ります:
- アドレスファミリィ。
- ホストアドレス。
- アプリケーションを特定するポート番号。
Windows Sockets2では、name パラメタはsockaddr 構造体へのポインタとして厳密に解釈されません。
それはWindows Sockets1.1の互換性のためにこのようにキャストされます。
サービスプロバイダーは、サイズ namelen のメモリのブロックへのポインタと自由にみなす事ができます。
このブロックの最初の2バイト(sockaddr 構造体の sa_family メンバに相当します)はソケットを作成するのに使用されたアドレスファミリィを含まなければなりません。
そうでなければ、エラーWSAEFAULTが起こります。
もしアプリケーションがケアしないなら、ローカルアドレスに何が割り当てられるか、
name パラメタの sa_data のメンバーのために明示的に固定値 ADDR_ANY を指定してください。
これで、基本的なサービスプロバイダーはどんな適切なネットワーク・アドレスも使用します。
潜在的に、マルチホームドホスト(すなわち、1つ以上のネットワークインタフェースとアドレスを持っているホスト)の面前にてアプリケーションプログラミングを簡素化します。
TCP/IPのために、もしポートがゼロと指定されるなら、
1024から5000の間の値としてアプリケーションにユニークなポートを、サービスプロバイダは割り当てます。
割り当てられたアドレスとポート番号を知るためには bind を呼び出した後に、
アプリケーションは getsockname を使用すると良い。
もしインターネット・アドレスが INADDR_ANY と等しいなら、
ソケットが接続されるまで getsockname はアドレスを必ずしも供給出来るとわけではありません、
もしホストがマルチホームであるならば、以降いくつかのアドレスは有効である場合があります。
ポート0以外の特定のポート番号をバインドする事はクライアントアプリケーションのためにお勧め出来ません、
以降、既にそのポート番号を使用すると別のソケットと衝突する危険があります。
ノート
SO_EXCLUSIVEADDR または SO_REUSEADDR ソケットオプションと共に bind を使用する時、
bind を実行する前に、影響があるようにソケットオプションを設定しなければなりません。
|