bind 関数 (winsock2.h)
バインド 関数は、ローカル アドレスをソケットに関連付けます。
構文
int WSAAPI bind(
[in] SOCKET s,
[in] const sockaddr *name,
[in] int namelen
);
パラメーター
[in] s
バインドされていないソケットを識別する記述子。
[in] name
バインドされたソケットに割り当てるローカル アドレスの sockaddr 構造体へのポインター。
[in] namelen
名 パラメーターが指す値の長さ (バイト単位)。
戻り値
エラーが発生しない場合、バインド
エラー コード | 意味 |
---|---|
|
|
|
ネットワーク サブシステムが失敗しました。 |
|
アクセス許可によって禁止されている方法でソケットにアクセスしようとしました。
このエラーは、setsockopt オプションが有効になっていないために、データグラム ソケットをブロードキャスト アドレスにバインドしようとして失敗した場合SO_BROADCAST返されます。 |
|
通常、各ソケット アドレス (プロトコル/ネットワーク アドレス/ポート) の使用は 1 つだけです。
このエラーは、コンピューター上のプロセスが既に同じ完全修飾アドレスにバインドされていて、ソケットが SO_REUSEADDR でアドレスの再利用を許可するようにマークされていない場合に返されます。 たとえば、名 パラメーターで指定された IP アドレスとポートは、別のアプリケーションで使用されている別のソケットに既にバインドされています。 詳細については、「 |
|
要求されたアドレスは、そのコンテキストでは無効です。
このエラーは、名 パラメーターが指す指定されたアドレスがこのコンピューター上の有効なローカル IP アドレスでない場合に返されます。 |
|
システムは、呼び出しでポインター引数を使用しようとしたときに、無効なポインター アドレスを検出しました。
このエラーは、名 パラメーターが NULL の場合に返されます。 名 パラメーターまたは namelen パラメーターがユーザー アドレス空間の有効な部分ではない、namelen パラメーターが小さすぎる、名 パラメーターに関連付けられているアドレス ファミリの正しくないアドレス形式が含まれている、名前で指定されたメモリ ブロックの最初の 2 バイト 関連付けられているアドレス ファミリと一致しないソケット記述子 。 |
|
ブロックしている Windows ソケット 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。 |
|
無効な引数が指定されました。
このエラーは、既にアドレスにバインド ソケット |
|
システムに十分なバッファー領域がなかったか、キューがいっぱいであるため、ソケットに対する操作を実行できませんでした。
このエラーは、十分なバッファーが使用できないか、接続が多すぎるため返されます。 |
|
ソケットではないものに対して操作が試行されました。
このエラーは、s パラメーター内の記述子がソケットでない場合に返されます。 |
備考
バインド 関数は、後続の listen 関数の呼び出しの前に、接続されていないソケットで必要です。 通常は、接続指向 (ストリーム) ソケットまたはコネクションレス (データグラム) ソケットにバインドするために使用されます。
バインド 関数を使用して、生のソケットにバインドすることもできます (ソケットは、型 パラメーターをSOCK_RAWに設定して ソケット 関数を呼び出すことによって作成されました)。
ソケット 関数の呼び出しでソケットが作成されると、そのソケットは名前空間 (アドレス ファミリ) に存在しますが、名前は割り当てされていません。 バインド 関数を使用して、名前のないソケットにローカル名を割り当てることで、ソケットのローカル関連付けを確立します。
インターネット アドレス ファミリを使用する場合、名前は次の 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 コマンドを使用して動的クライアント ポート範囲
アプリケーションは、バインド
マルチキャスト操作の場合は、バインド 関数を呼び出してソケットをローカル IP アドレスに関連付け、マルチキャスト グループに参加することをお勧めします。 この操作の順序は必須ではありませんが、強くお勧めします。 そのため、マルチキャスト アプリケーションではまず、ローカル コンピューター上の IPv4 または IPv6 アドレス、ワイルドカード IPv4 アドレス (INADDR_ANY)、またはワイルドカード IPv6 アドレス (in6addr_any) を選択します。 マルチキャスト アプリケーションは、ローカル IP アドレスをソケットに関連付けるために、名 パラメーターの sa_data メンバー内のこのアドレスを使用して、バインド 関数を呼び出します。 ワイルドカード アドレスが指定されている場合、Windows は使用するローカル IP アドレスを選択します。
バインド 関数が完了すると、アプリケーションは目的のマルチキャスト グループに参加します。 マルチキャスト グループに参加する方法の詳細については、マルチキャスト プログラミングのセクション
バインド 関数は、通常、マルチキャスト グループへの送信操作には必要ありません。
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 ストア アプリでサポートされています。
例
次の例では、バインド 関数の使用方法を示します。
#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 |
関連項目
SO_REUSEADDRとSO_EXCLUSIVEADDRUSEの使用の
WSACancelBlockingCall の
sockaddr を
ソケット