Win32 API 日本語リファレンス
ホーム › Networking.WinSock › LPWSPBIND

LPWSPBIND

コールバック

シグネチャ

INT LPWSPBIND(
    SOCKET s,
    SOCKADDR* name,
    INT namelen,
    INT* lpErrno
);

パラメーター

フィールド型説明
sSOCKETバインドされていないソケットを識別する記述子。
nameSOCKADDR*

ソケットに割り当てるアドレス。sockaddr 構造体の形式で指定します。

sa_family メンバーを除き、sockaddr の内容はネットワークバイトオーダーで表現されます。Windows Sockets 2 では、name パラメーターは厳密に sockaddr 構造体へのポインターとして解釈されるわけではありません。Winsock との互換性のためにこのようにキャストされています。実際の構造体は、アドレスファミリーごとに異なる解釈がなされます。唯一の要件は、先頭の u_short がアドレスファミリーであること、およびメモリバッファーの合計サイズ (バイト単位) が namelen であることです。

namelenINTname パラメーターが指す構造体の長さ (バイト単位)。
lpErrnoINT*エラーコードへのポインター。

公式ドキュメント

LPWSPBind 関数は、ローカルアドレス (つまり名前) をソケットに関連付けます。

戻り値

エラーが発生しなかった場合、LPWSPBind は 0 を返します。それ以外の場合は SOCKET_ERROR を返し、固有のエラーコードが lpErrno に格納されます。

エラーコード 意味
WSAENETDOWN
ネットワークサブシステムが機能しなくなりました。
WSAEADDRINUSE
ローカルコンピューター上のいずれかのプロセスが、既に同じ完全修飾アドレス (たとえば **AF_INET** の場合は IP アドレスとポート) にバインドしており、かつそのソケットは SO_REUSEADDR によるアドレスの再利用を許可するようにマークされていません。(LPWSPSetSockOpt の SO_REUSEADDR ソケットオプションを参照してください。)
WSAEADDRNOTAVAIL
指定されたアドレスは、このコンピューターでは有効なアドレスではありません。
WSAEFAULT
name または namelen パラメーターがユーザーアドレス空間の有効な部分ではない、namelen パラメーターが小さすぎる、name パラメーターに関連付けられたアドレスファミリーに対して不正なアドレス形式が含まれている、または name で指定されたメモリブロックの先頭 2 バイトが、ソケット記述子 s に関連付けられたアドレスファミリーと一致しません。
WSAEINPROGRESS
コールバックの処理中に関数が呼び出されました。
WSAEINVAL
ソケットは既にアドレスにバインドされています。
WSAENOBUFS
利用可能なバッファーが不足しています。接続が多すぎます。
WSAENOTSOCK
記述子がソケットではありません。

解説(Remarks)

LPWSPBind 関数は、LPWSPConnect 関数または LPWSPListen 関数を後続して呼び出す前に、未接続のコネクションレス型またはコネクション指向型のソケットに対して使用します。LPWSPSocket でソケットを作成すると、そのソケットは名前空間 (アドレスファミリー) 内に存在しますが、名前もローカルアドレスも割り当てられていません。LPWSPBind 関数は、名前のないソケットにローカル名を割り当てることで、ソケットのローカルな関連付けを確立します。

たとえばインターネットアドレスファミリーでは、名前はアドレスファミリー、ホストアドレス、および Winsock SPI クライアントを識別するポート番号の 3 つの部分で構成されます。Windows Sockets 2 では、name パラメーターは厳密に sockaddr 構造体へのポインターとして解釈されるわけではありません。サービスプロバイダーは、これをサイズ namelen のメモリブロックへのポインターと見なしてかまいません。このブロックの先頭 2 バイト (sockaddr 宣言の sa_family に相当) には、ソケットの作成に使用したアドレスファミリーが格納されている必要があります。そうでない場合は、エラー WSAEFAULT が示されます。

Windows Sockets 2 SPI クライアントが、割り当てられるローカルアドレスを問わない場合は、name パラメーターの sa_data メンバーにマニフェスト定数値 ADDR_ANY を指定します。これにより、サービスプロバイダーは適切な任意のネットワークアドレスを使用します。TCP/IP の場合、ポートに 0 を指定すると、サービスプロバイダーは 1024 から 5000 までの値を持つ一意のポートを Winsock SPI クライアントに割り当てます。SPI クライアントは、LPWSPBind の後に LPWSPGetSockName を使用して、割り当てられたアドレスとポートを知ることができます。ただし、インターネットアドレスが INADDR_ANY の場合、ホストがマルチホームであれば複数のアドレスが有効になり得るため、LPWSPGetSockOpt はソケットが接続されるまで必ずしもアドレスを提供できるとは限らない点に注意してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)