英語で読む

次の方法で共有


bind 関数 (winsock2.h)

バインド 関数は、ローカル アドレスをソケットに関連付けます。

構文

int WSAAPI bind(
  [in] SOCKET         s,
  [in] const sockaddr *name,
  [in] int            namelen
);

パラメーター

[in] s

バインドされていないソケットを識別する記述子。

[in] name

バインドされたソケットに割り当てるローカル アドレスの sockaddr 構造体へのポインター。

[in] namelen

パラメーターが指す値の長さ (バイト単位)。

戻り値

エラーが発生しない場合、バインド は 0 を返します。 それ以外の場合はSOCKET_ERRORを返し、WSAGetLastError呼び出すことによって特定のエラー コードを取得できます。

エラー コード 意味
WSANOTINITIALIZED の
注意 この関数を使用する前に、WSAStartup 呼び出し 正常に実行する必要があります。
 
WSAENETDOWN の
ネットワーク サブシステムが失敗しました。
WSAEACCES の
アクセス許可によって禁止されている方法でソケットにアクセスしようとしました。

このエラーは、setsockopt オプションが有効になっていないために、データグラム ソケットをブロードキャスト アドレスにバインドしようとして失敗した場合SO_BROADCAST返されます。

WSAEADDRINUSE の
通常、各ソケット アドレス (プロトコル/ネットワーク アドレス/ポート) の使用は 1 つだけです。

このエラーは、コンピューター上のプロセスが既に同じ完全修飾アドレスにバインドされていて、ソケットが SO_REUSEADDR でアドレスの再利用を許可するようにマークされていない場合に返されます。 たとえば、 パラメーターで指定された IP アドレスとポートは、別のアプリケーションで使用されている別のソケットに既にバインドされています。 詳細については、「SOL_SOCKET ソケット オプション」 リファレンスの「SO_REUSEADDR ソケット オプション」、SO_REUSEADDRとSO_EXCLUSIVEADDRUSEの使用の 、および SO_EXCLUSIVEADDRUSEを参照してください。

WSAEADDRNOTAVAIL を する
要求されたアドレスは、そのコンテキストでは無効です。

このエラーは、 パラメーターが指す指定されたアドレスがこのコンピューター上の有効なローカル IP アドレスでない場合に返されます。

WSAEFAULT の
システムは、呼び出しでポインター引数を使用しようとしたときに、無効なポインター アドレスを検出しました。

このエラーは、 パラメーターが NULL の場合に返されます。 パラメーターまたは namelen パラメーターがユーザー アドレス空間の有効な部分ではない、namelen パラメーターが小さすぎる、 パラメーターに関連付けられているアドレス ファミリの正しくないアドレス形式が含まれている、名前で指定されたメモリ ブロックの最初の 2 バイト 関連付けられているアドレス ファミリと一致しないソケット記述子

WSAEINPROGRESS を する
ブロックしている Windows ソケット 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。
WSAEINVAL の
無効な引数が指定されました。

このエラーは、既にアドレスにバインド ソケット 返されます。

WSAENOBUFS の
システムに十分なバッファー領域がなかったか、キューがいっぱいであるため、ソケットに対する操作を実行できませんでした。

このエラーは、十分なバッファーが使用できないか、接続が多すぎるため返されます。

WSAENOTSOCK の
ソケットではないものに対して操作が試行されました。

このエラーは、s パラメーター内の記述子がソケットでない場合に返されます。

備考

バインド 関数は、後続の listen 関数の呼び出しの前に、接続されていないソケットで必要です。 通常は、接続指向 (ストリーム) ソケットまたはコネクションレス (データグラム) ソケットにバインドするために使用されます。 バインド 関数を使用して、生のソケットにバインドすることもできます (ソケットは、 パラメーターをSOCK_RAWに設定して ソケット 関数を呼び出すことによって作成されました)。 バインド 関数は、connectConnectEx、WSAConnect、WSAConnectByList、または送信操作の前に WSAConnectByName 関数を する前に、接続されていないソケットでも使用できます。

ソケット 関数の呼び出しでソケットが作成されると、そのソケットは名前空間 (アドレス ファミリ) に存在しますが、名前は割り当てされていません。 バインド 関数を使用して、名前のないソケットにローカル名を割り当てることで、ソケットのローカル関連付けを確立します。

インターネット アドレス ファミリを使用する場合、名前は次の 3 つの部分で構成されます。

  • アドレス ファミリ。
  • ホスト アドレス。
  • アプリケーションを識別するポート番号。

Windows ソケット 2 では、 パラメーターは、sockaddr 構造体へのポインターとして厳密に解釈されません。 Windows ソケット 1.1 の互換性のために、この方法でキャストされます。 サービス プロバイダーは、サイズ namelenのメモリ ブロックへのポインターとして自由に見なします。 このブロックの最初の 2 バイト (sockaddr 構造体の sa_family メンバー、sockaddr_in 構造体の sin_family メンバー、または sockaddr_in6 構造体の sin6_family メンバーに対応) には、ソケットの作成に使用されたアドレス ファミリが含まれている必要があります。 それ以外の場合は、WSAEFAULT エラーが発生します。

アプリケーションが割り当てるローカル アドレスを気にしない場合は、IPv4 ローカル アドレスに INADDR_ANY 定数値を指定するか、 パラメーターの sa_data メンバーで IPv6 ローカル アドレスに in6addr_any 定数値を指定します。 これにより、基になるサービス プロバイダーは任意の適切なネットワーク アドレスを使用できるため、マルチホーム ホスト (つまり、複数のネットワーク インターフェイスとアドレスを持つホスト) が存在する場合に、アプリケーション プログラミングが簡略化される可能性があります。

TCP/IP の場合、ポートがゼロとして指定されている場合、サービス プロバイダーは動的クライアント ポート範囲からアプリケーションに一意のポートを割り当てます。 Windows Vista 以降では、動的クライアント のポート範囲は 49152 ~ 65535 の値です。 これは、Windows Server 2003 以前からの変更であり、動的クライアント のポート範囲は 1025 から 5000 の間の値でした。 クライアントの動的ポート範囲の最大値は、次のレジストリ キーの値を設定することで変更できます。

HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters を する

MaxUserPort レジストリ値は、動的クライアント ポート範囲の最大値に使用する値を設定します。 この設定を有効にするには、コンピューターを再起動する必要があります。

Windows Vista 以降では、netsh コマンドを使用して動的クライアント ポート範囲 表示および変更できます。 動的クライアント ポート範囲は、UDP と TCP、および IPv4 と IPv6 に対して異なる方法で設定できます。 詳細については、KB 929851を参照してください。

アプリケーションは、バインド 呼び出した後、getsockname を使用して、ソケットに割り当てられているアドレスとポートを学習できます。 インターネット アドレスが INADDR_ANY または in6addr_anyと等しい場合、getsockname は、ソケットが接続されるまで必ずしもアドレスを指定できません。ホストがマルチホームの場合、複数のアドレスが有効になる可能性があるためです。 ローカル コンピューターで既にそのポート番号を使用している別のソケットと競合する危険性があるため、クライアント アプリケーションでは、ポート 0 以外の特定のポート番号へのバインドは推奨されません。

バインド を SO_EXCLUSIVEADDRUSE または SO_REUSEADDR ソケット オプションと共に使用する場合は、バインド を実行する前にソケット オプション 設定して影響を与える必要があります。 詳細については、「SO_REUSEADDRとSO_EXCLUSIVEADDRUSEの使用の SO_EXCLUSIVEADDRUSE」を参照してください。

 

マルチキャスト操作の場合は、バインド 関数を呼び出してソケットをローカル IP アドレスに関連付け、マルチキャスト グループに参加することをお勧めします。 この操作の順序は必須ではありませんが、強くお勧めします。 そのため、マルチキャスト アプリケーションではまず、ローカル コンピューター上の IPv4 または IPv6 アドレス、ワイルドカード IPv4 アドレス (INADDR_ANY)、またはワイルドカード IPv6 アドレス (in6addr_any) を選択します。 マルチキャスト アプリケーションは、ローカル IP アドレスをソケットに関連付けるために、 パラメーターの sa_data メンバー内のこのアドレスを使用して、バインド 関数を呼び出します。 ワイルドカード アドレスが指定されている場合、Windows は使用するローカル IP アドレスを選択します。 バインド 関数が完了すると、アプリケーションは目的のマルチキャスト グループに参加します。 マルチキャスト グループに参加する方法の詳細については、マルチキャスト プログラミングのセクション 参照してください。 このソケットを使用すると、recvrecvfromWSARecvExWSARecvExWSARecvFrom、または LPFN_WSARECVMSG (WSARecvMsg) 関数を使用して、マルチキャスト グループからマルチキャスト パケットを受信できます。

バインド 関数は、通常、マルチキャスト グループへの送信操作には必要ありません。 sendto、WSASendMsg、および WSASendTo 関数 ソケットがまだバインドされていない場合は、ソケットをワイルドカード アドレスに暗黙的にバインドします。 バインド 関数は、暗黙的なバインドを実行せず、接続されているソケットでのみ許可される、送信または WSASend 関数を使用する前に必要です。つまり、接続するにはソケットが既にバインドされている必要があります。 バインド 関数は、sendto、WSASendMsg、または WSASendTo 関数を使用して送信操作を行う前に使用できます。また、アプリケーションが複数のネットワーク インターフェイスとローカル IP アドレスを持つローカル コンピューター上の特定のローカル IP アドレスを選択する場合は、WSASendTo 関数を使用できます。 それ以外の場合は、sendto、WSASendMsg、または WSASendTo 関数 使用してワイルドカード アドレスに暗黙的にバインドすると、送信操作に別のローカル IP アドレスが使用される可能性があります。

バインドなどのブロッキング Winsock 呼び出し 発行する場合、Winsock は、呼び出しを完了する前にネットワーク イベントを待機する必要がある場合があります。 Winsock は、この状況でアラート可能な待機を実行します。この待機は、同じスレッドでスケジュールされた非同期プロシージャ 呼び出し (APC) によって中断される可能性があります。 同じスレッドで進行中の Winsock 呼び出しを中断した別のブロック Winsock 呼び出しを APC 内で発行すると、未定義の動作が発生し、Winsock クライアントが試行してはなりません。
 

IrDA ソケットの に関する注意事項

  • Af_irda.h ヘッダー ファイルは明示的に含まれている必要があります。
  • ローカル名は IrDA では公開されません。 そのため、IrDA クライアント ソケットは、 関数に接続する前に、バインド 関数を呼び出してはなりません。 IrDA ソケットが以前、バインドを使用してサービス名にバインドされていた場合、接続 関数はSOCKET_ERRORで失敗します。
  • サービス名が "LSAP-SELxxx" という形式の場合(xxx は 1 から 127 の範囲の 10 進整数)、アドレスはサービス名ではなく特定の LSAP-SEL xxx を示します。 このようなサービス名を使用すると、サーバー アプリケーションは、最初に ISA サービス名クエリを実行せずに、特定の LSAP-SEL に向けられた着信接続を受け入れ、関連付けられた LSAP-SEL を取得できます。 このサービス名の種類の 1 つの例は、IAS をサポートしていない Windows 以外のデバイスです。

Windows Phone 8: この機能は、Windows Phone 8 以降の Windows Phone ストア アプリでサポートされています。

Windows 8.1 および windows Server 2012 R2: この関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストア アプリでサポートされています。

次の例では、バインド 関数の使用方法を示します。 バインド 関数を使用する別の例については、「Winsockの概要 参照してください。

#ifndef UNICODE
#define UNICODE
#endif

#define WIN32_LEAN_AND_MEAN

#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>

// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")

int main()
{

    // Declare some variables
    WSADATA wsaData;

    int iResult = 0;            // used to return function results

    // the listening socket to be created
    SOCKET ListenSocket = INVALID_SOCKET;

    // The socket address to be passed to bind
    sockaddr_in service;

    //----------------------
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"Error at WSAStartup()\n");
        return 1;
    }
    //----------------------
    // Create a SOCKET for listening for 
    // incoming connection requests
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ListenSocket == INVALID_SOCKET) {
        wprintf(L"socket function failed with error: %u\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port for the socket that is being bound.
    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr("127.0.0.1");
    service.sin_port = htons(27015);

    //----------------------
    // Bind the socket.
    iResult = bind(ListenSocket, (SOCKADDR *) &service, sizeof (service));
    if (iResult == SOCKET_ERROR) {
        wprintf(L"bind failed with error %u\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    else
        wprintf(L"bind returned success\n");

    WSACleanup();
    return 0;
}


必要条件

要件 価値
サポートされる最小クライアント Windows 8.1、Windows Vista [デスクトップ アプリ |UWP アプリ]
サポートされる最小サーバー Windows Server 2003 [デスクトップ アプリ |UWP アプリ]
ターゲット プラットフォーム の ウィンドウズ
ヘッダー winsock2.h (Winsock2.h を含む)
ライブラリ Ws2_32.lib
DLL Ws2_32.dll

関連項目

マルチキャスト プログラミング

SOL_SOCKET ソケット オプションの

SO_EXCLUSIVEADDRUSE

TCP/IP Raw Sockets

SO_REUSEADDRとSO_EXCLUSIVEADDRUSEの使用の

WSACancelBlockingCall の

Winsock Functions

Winsock リファレンス

接続

getsockname

をリッスンする

setsockopt

sockaddr を する

ソケット