bind
更新日2006年11月22日
参照 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/bind_2.asp

機能
bind関数はローカルアドレスをソケットに関連づけます。

書式
int bind(
  SOCKET s,
  const struct sockaddr* name,
  int namelen
);
引数
s [入] 無限のソケットを特定する記述子。
name [入] sockaddr構造体よりソケットに割り当てるアドレス。
namelen [入] nameパラメタの長さ、バイト数。
戻り値
エラーが発生しない場合、bindはゼロを戻します。 さもなければ、SOCKET_ERRORを戻します、 そして、WSAGetLastErrorを呼ぶことによって、特定のエラーコードを検索することができます。

エラーコード 意味
WSANOTINITIALISED
この関数を使用する前に、WSAStartup呼び出しが成功している必要があります。
WSAENETDOWN
ネットワークサブシステムは失敗しました。
WSAEACCES
setsockoptオプションSO_BROADCASTが有効にされないので、 データグラムソケットをブロードキャストアドレスに接続する試みは失敗しました。
WSAEADDRINUSE
コンピュータの上のプロセスは既に同じ完全に適切なアドレスに縛られます、そして、ソケットは、SO_REUSEADDRとのアドレス再利用を許すためにマークされていません。 (例えば、IPアドレスとポートはaf_inet場合で制限されています。) (setsockoptの下でSO_REUSEADDRソケットオプションを参照してください。)
WSAEADDRNOTAVAIL
指定されたアドレスはこのコンピュータのための有効なアドレスではありません。
WSAEFAULT
name または namelen パラメタはユーザアドレス空間の有効な部分ではありません、 namelenパラメタは小さ過ぎます、 name パラメタは関連アドレスファミリィにとって、不正確なアドレス形式を含んでいます。 または、name によって指定されたメモリブロックの最初の2バイトはソケット記述子 s に関連づけられたアドレスファミリィに合いません。
WSAEINPROGRESS
ブロッキングWindows Sockets1.1呼び出しが進行しているか、 またはサービスプロバイダーはまだコールバック関数を処理中です。
WSAEINVAL
ソケットは既にアドレスにバインドされています。
WSAENOBUFS
利用可能なバッファが十分ではありません、接続が多すぎます。
WSAENOTSOCK
記述子はソケットではありません。

注釈

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 を実行する前に、影響があるようにソケットオプションを設定しなければなりません。


Example Code
以下の例は bind 関数の使用を示します。 [winsock2bind_example1.c]
/*
 * file:winsock2bind_example1.c
 * The bind function associates a local address with a socket.
 * 参照 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/bind_2.asp
 */
#include <stdio.h>
#include "winsock2.h"

int main()
{
    /*
     * 変数の宣言。
     */
    WSADATA wsaData;
    int iResult = 0;
    SOCKET ListenSocket;
    struct sockaddr_in service;

    /*
     * Winsockの初期化。
     */
    iResult = WSAStartup(MAKEWORD(22), &wsaData);
    if (iResult != NO_ERROR)
    {
        printf("Error at WSAStartup()\n");
        return 0;
    }

    /*
     * 接続要求受入用のリスニング用のソケットを作成。
     */
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ListenSocket == INVALID_SOCKET)
    {
        printf("Error at socket(): %ld\n", WSAGetLastError());
        WSACleanup();
        return 0;
    }

    /*
     * そのsockaddr_in構造体はそのアドレスファミリィを指定する、
     * IPアドレス、そして、結びつけられているソケットのためのポート。
     */
    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr("127.0.0.1");
    service.sin_port = htons(27015);

    /*
     * ソケットをバインドする。
     */
    if (bind(ListenSocket, (SOCKADDR*)&service, sizeof(service))
            == SOCKET_ERROR)
    {
        printf("bind() failed.\n");
        closesocket(ListenSocket);
        return 0;
    }

    WSACleanup();
    return 0;
}
bind 関数使用における別の例は、Winsock2事始めを参照してください。

IrDAソケットのためのノート
  • Af_irda.h ヘッダファイルは明示的にインクルードしなければなりません。
  • IrDAではローカル名はさらされません。 したがってIrDAクライアントソケット、 connect 関数の前に bind 関数を決して呼んではいけません。 もし以前にIrDAソケットがそうであったなら、bind を使用することでサービス名にバウンドしてください。 connect 関数はSOCKET_ERRORと共に失敗するでしょう。
  • もしサービス名が "LSAP-SELxxx," であるならば、xxxは1-127の範囲内の10進整数です。 アドレスはサービス名よりむしろ特定のLSAP-SEL xxxを示します。 これらなどのサービス名で、サーバ・アプリケーションは特定のLSAP-SELに向けられた接続要求を受け入れます。 最初にISAサービスを実行しないで、質問を命名して、関連LSAP-SELを手に入れてください。 このサービス名前タイプに関する1つの例がIASをサポートしない非Windowsデバイスです。

要求環境
Client Requires Windows Vista, Windows XP, Windows 2000 Professional, Windows NT Workstation, Windows Me, Windows 98, or Windows 95.
Server Requires Windows Server "Longhorn", Windows Server 2003, Windows 2000 Server, or Windows NT Server.
Header Declared in Winsock2.h.
Library Use libws2_32.a
DLL Requires Ws2_32.dll.

参照
Winsock Reference
Winsock Functions
connect
getsockname
listen
setsockopt
sockaddr
socket
WSACancelBlockingCall