bind 関数 (winsock2.h)
バインド関数は、ローカル アドレスをソケットに関連付けます。
構文
int WSAAPI bind(
[in] SOCKET s,
[in] const sockaddr *name,
[in] int namelen
);
パラメーター
[in] s
バインドされていないソケットを識別する記述子。
[in] name
バインドされたソケット に割り当てるローカル アドレスの sockaddr 構造体へのポインター。
[in] namelen
name パラメーターが指す値の長さ (バイト単位)。
戻り値
エラーが発生しない場合、 bind は 0 を返します。 それ以外の場合は、SOCKET_ERRORを返し、 WSAGetLastError を呼び出すことで特定のエラー コードを取得できます。
エラー コード | 意味 |
---|---|
メモ この関数を使用する前に 、WSAStartup 呼び出しが正常に行われる必要があります。
|
|
ネットワーク サブシステムが失敗しました。 | |
アクセス許可で禁じられた方法でソケットにアクセスしようとしました。
setsockopt オプション SO_BROADCASTが有効になっていないため、nn がデータグラム ソケットをブロードキャスト アドレスにバインドしようとして失敗した場合、このエラーが返されます。 |
|
Only one usage of each socket address (protocol/network address/port) is normally permitted.
このエラーは、コンピューター上のプロセスが既に同じ完全修飾アドレスにバインドされていて、ソケットが SO_REUSEADDR でアドレスの再利用を許可するようにマークされていない場合に返されます。 たとえば、 name パラメーターで指定された IP アドレスとポートは、別のアプリケーションで使用されている別のソケットに既にバインドされています。 詳細については、「SOL_SOCKET ソケット オプション リファレンス」、「SO_REUSEADDRとSO_EXCLUSIVEADDRUSEの使用」、および「SO_EXCLUSIVEADDRUSE」の「SO_REUSEADDRソケット オプション」を参照してください。 |
|
要求されたアドレスは、そのコンテキストでは有効ではありません。
name パラメーターが指す指定されたアドレスがこのコンピューターの有効なローカル IP アドレスでない場合、このエラーが返されます。 |
|
呼び出しでポインター引数を使用しようとしたときに、システムにより、無効なポインター アドレスが検出されました。
このエラーは、 name パラメーターが NULL、 name または namelen パラメーターがユーザー アドレス空間の有効な部分ではない、 namelen パラメーターが小さすぎる、 name パラメーターに関連付けられているアドレス ファミリのアドレス形式が正しくない、または name で指定されたメモリ ブロックの最初の 2 バイトがソケット記述子 に関連付けられているアドレス ファミリと一致しない場合に返されます。 |
|
ブロックしている Windows ソケット 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。 | |
無効な引数が指定されました。
このエラーは、既にアドレスにバインドされているソケット s から返されます。 |
|
システムに十分なバッファー領域がないか、キューがいっぱいであるため、ソケットに対する操作を実行できませんでした。
このエラーは、十分なバッファーが使用できないか、接続が多すぎるため返されます。 |
|
ソケットではないものに対して操作が試行されました。
このエラーは、 s パラメーターの記述子がソケットでない場合に返されます。 |
注釈
バインド関数は、後続の listen 関数の呼び出しの前に、接続されていないソケットで必要です。 通常は、接続指向 (ストリーム) ソケットまたはコネクションレス (データグラム) ソケットにバインドするために使用されます。 bind 関数を使用して生ソケットにバインドすることもできます (ソケットは、type パラメーターを SOCK_RAW に設定してソケット関数を呼び出すことによって作成されました)。 バインド関数は、送信操作の前に connect、ConnectEx、WSAConnect、WSAConnectByList、または WSAConnectByName 関数を後続で呼び出す前に、接続されていないソケットでも使用できます。
ソケット関数の呼び出しでソケットが作成されると、 ソケット は名前空間 (アドレス ファミリ) に存在しますが、名前は割り当てされていません。 バインド関数を使用して、名前のないソケットにローカル名を割り当てることで、ソケットのローカル関連付けを確立します。
インターネット アドレス ファミリを使用する場合、名前は次の 3 つの部分で構成されます。
- アドレス ファミリ。
- ホスト アドレス。
- アプリケーションを識別するポート番号。
Windows ソケット 2 では、 name パラメーターは sockaddr 構造体へのポインターとして厳密には解釈されません。 これは、Windows ソケット 1.1 の互換性のためにこの方法でキャストされます。 サービス プロバイダーは、サイズ namelen のメモリ ブロックへのポインターとして自由に見 なします。 このブロック内の最初の 2 バイト (sockaddr 構造体のsa_family メンバー、sockaddr_in構造体のsin_family メンバー、または sockaddr_in6構造体のsin6_family メンバーに対応) には、ソケットの作成に使用されたアドレス ファミリが含まれている必要があります。 それ以外の場合は、WSAEFAULT エラーが発生します。
アプリケーションが割り当てられているローカル アドレスを気にしない場合は、iPv4 ローカル アドレスにINADDR_ANY定数値を指定するか、name パラメーターの sa_data メンバーで IPv6 ローカル アドレスにin6addr_any定数値を指定します。 これにより、基になるサービス プロバイダーは適切なネットワーク アドレスを使用できるため、 マルチホーム ホスト (つまり、複数のネットワーク インターフェイスとアドレスを持つホスト) が存在するアプリケーション プログラミングが簡略化される可能性があります。
TCP/IP の場合、ポートがゼロとして指定されている場合、サービス プロバイダーは動的クライアント ポート範囲からアプリケーションに一意のポートを割り当てます。 Windows Vista 以降では、動的クライアント ポート範囲は 49152 ~ 65535 の値です。 これは、動的クライアント ポート範囲が 1025 ~ 5000 の値であった Windows Server 2003 以前からの変更です。 クライアントの動的ポート範囲の最大値は、次のレジストリ キーの下に値を設定することで変更できます。
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
MaxUserPort レジストリ値は、動的クライアント ポート範囲の最大値に使用する値を設定します。 この設定を有効にするには、コンピューターを再起動する必要があります。
Windows Vista 以降では、 netsh コマンドを使用して動的クライアント ポート範囲を表示および変更できます。 動的クライアント ポート範囲は、UDP と TCP、および IPv4 と IPv6 に対して異なる方法で設定できます。 詳細については、「 KB 929851」を参照してください。
アプリケーションでは、bind を呼び出した後に getsockname を使用して、ソケットに割り当てられているアドレスとポートを学習できます。 インターネット アドレスが INADDR_ANY または in6addr_any と等しい場合、ホストがマルチホームの場合に複数のアドレスを有効にできるため、ソケットが接続されるまで は、必ずしもアドレスを指定 できません。 クライアント アプリケーションでは、ローカル コンピューターでそのポート番号を既に使用している別のソケットと競合する危険性があるため、ポート 0 以外の特定のポート番号へのバインドは推奨されません。
マルチキャスト操作の場合は、 bind 関数を呼び出してソケットをローカル IP アドレスに関連付け、マルチキャスト グループに参加することをお勧めします。 この操作の順序は必須ではありませんが、強くお勧めします。 そのため、マルチキャスト アプリケーションではまず、ローカル コンピューター上の IPv4 または IPv6 アドレス、ワイルドカード IPv4 アドレス (INADDR_ANY)、またはワイルドカード IPv6 アドレス (in6addr_any) を選択します。 その後、マルチキャスト アプリケーションは、name パラメーターの sa_data メンバー内の このアドレスを使用して bind 関数を呼び出して、ローカル IP アドレスをソケットに関連付けます。 ワイルドカード アドレスが指定されている場合、Windows は使用するローカル IP アドレスを選択します。 バインド関数が完了すると、アプリケーションは目的のマルチキャスト グループに参加します。 マルチキャスト グループに参加する方法の詳細については、「マルチキャスト プログラミング」のセクションを参照してください。 このソケットを使用すると、recv、recvfrom、WSARecv、WSARecvEx、WSARecvFrom、または LPFN_WSARECVMSG (WSARecvMsg) 関数を使用して、マルチキャスト グループからマルチキャスト パケットを受信できます。
バインド 関数は 通常、マルチキャスト グループへの送信操作には必要ありません。 sendto、WSASendMsg、および WSASendTo 関数は、ソケットがまだバインドされていない場合、ソケットをワイルドカード アドレスに暗黙的にバインドします。 バインド関数は、暗黙的な バインド を実行せず、接続されているソケットでのみ許可される send 関数または WSASend 関数を使用する前に必要です。つまり、接続するにはソケットが既にバインドされている必要があります。 バインド関数は、アプリケーションが複数のネットワーク インターフェイスとローカル IP アドレスを持つローカル コンピューター上の特定のローカル IP アドレスを選択する場合に、sendto、WSASendMsg、または WSASendTo 関数を使用して操作を送信する前に使用できます。 それ以外の場合、sendto、WSASendMsg、または WSASendTo 関数を使用してワイルドカード アドレスに暗黙的にバインドすると、送信操作に別のローカル IP アドレスが使用される可能性があります。
IrDA ソケットに関する注意事項
- Af_irda.h ヘッダー ファイルは明示的に含まれている必要があります。
- ローカル名は IrDA では公開されません。 したがって、IrDA クライアント ソケットは、connect 関数の前にバインド関数を呼び出す必要はありません。 IrDA ソケットが bind を使用してサービス名にバインドされていた場合、 connect 関数は 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 アプリ] |
対象プラットフォーム | Windows |
ヘッダー | winsock2.h (Winsock2.h を含む) |
Library | Ws2_32.lib |
[DLL] | Ws2_32.dll |