名前解決データ構造
名前解決関数全体で広く使用されている重要なデータ構造がいくつかあります。
Query-Related データ構造
WSAQUERYSET 構造体は、WSALookupServiceBegin のクエリを作成するために使用され、WSALookupServiceNext のクエリ結果を配信するために使用されます。 他のいくつかの構造体へのポインターが含まれており、その一部はまだ他の構造体を参照しているため、これは複雑な構造です。 WSAQUERYSET 構造体と、それが参照する構造体の関係を次に示します。
WSAQUERYSET 構造体内では、ほとんどのメンバーは自明ですが、追加の説明に値するものもあります。 dwSize メンバーは常に sizeof(WSAQUERYSET) で入力する必要があります。これは、時間の経過と共に表示される可能性のある WSAQUERYSET 構造体のさまざまなバージョンを検出して適応するために名前空間プロバイダーによって使用されるためです。
dwOutputFlags メンバーは、クエリ結果に関する追加情報を提供するために名前空間プロバイダーによって使用されます。 詳細については、 WSALookupServiceNext 関数を 参照してください。
lpversion メンバーによって参照される WSAECOMPARATOR 構造体は、クエリ制約と結果の両方に使用されます。 クエリの場合、 dwVersion メンバーはサービスの目的のバージョンを示します。 ecHow メンバーは、比較の方法を指定する列挙型です。 選択肢はCOMP_EQUALSであり、バージョンで完全に一致する必要があります。または、サービスのバージョン番号が dwVersion メンバーの値より小さいことを指定するCOMP_NOTLESS。
dwNameSpace と lpNSProviderId の解釈は、構造体がどのように使用されているかによって異なり、この構造体を利用する個々の関数の説明で詳しく説明されています。
lpszContext メンバーは階層型名前空間に適用され、クエリの開始点またはサービスが存在する階層内の場所を指定します。 一般的なルールは次のとおりです:
- NULL の値が空白 ("") の場合、既定のコンテキストで検索が開始されます。
- 値 "\" を指定すると、名前空間の先頭から検索が開始されます。
- その他の値を指定すると、指定されたポイントで検索が開始されます。
包含をサポートしていないプロバイダーは、"" または "\" 以外のものが指定されている場合にエラーを返す可能性があります。 グループなどの制限付き包含をサポートするプロバイダーは、""、'\"、または指定されたポイントを受け入れる必要があります。 コンテキストは名前空間固有です。 dwNameSpace メンバーがNS_ALLされている場合は、"" または "\" のみがコンテキストとして渡される必要があります。これらはすべての名前空間によって認識されるためです。
lpszQueryString メンバーは、"FTP/TCP" のように、よく知られているサービスとトランスポート プロトコル名を記述する文字列など、名前空間固有の追加のクエリ情報を提供するために使用されます。
lpafpProtocols メンバーによって参照される AFPROTOCOLS 構造体は、クエリの目的でのみ使用され、クエリを制約するプロトコルの一覧を提供します。 プロトコル値はアドレス ファミリのコンテキスト内でのみ意味を持つので、これらのプロトコルは (アドレス ファミリ、プロトコル) ペアとして表されます。
lpcsaBuffer メンバーによって参照されるCSADDR_INFO構造体の配列には、リッスンの確立に使用するサービス、またはクライアントがサービスへの接続を確立するために使用するために必要なすべての情報が含まれています。 LocalAddr メンバーと RemoteAddr メンバーの両方に、SOCKET_ADDRESS構造体が直接含まれています。
サービスは、LocalAddr.lpSockaddr-sa_family>、iSocketType、および iProtocol のタプルをパラメーターとして使用して、ソケットまたは WSASocket 関数を呼び出してソケットを作成します。 サービスは、LocalAddr.lpSockaddr および LocalAddr.lpSockaddrLength をパラメーターとして使用してバインド関数を呼び出すことによって、ソケットをローカル アドレスにバインドします。
クライアントは、LocalAddr.lpSockaddr-sa_family>、iSocketType、および iProtocol のタプルをパラメーターとして使用して、ソケットまたは WSASocket 関数を呼び出してソケットを作成します。 クライアントは、connect、ConnectEx、または WSAConnect 関数を使用してリモート接続を行うときに、RemoteAddr.lpSockaddr と RemoteAddr.lpSockaddrLength の組み合わせをパラメーターとして使用します。
サービス クラスのデータ構造
新しいサービス クラスがインストールされている場合は、 WSASERVICECLASSINFO 構造体を準備して指定する必要があります。 この構造体は、特定の名前空間に適用される一連のメンバーを含むサブ構造でも構成されます。 クラス情報データ構造は次のとおりです。
サービス クラスごとに、1 つの WSASERVICECLASSINFO 構造体があります。 WSASERVICECLASSINFO 構造体内では、サービス クラスの一意識別子が lpServiceClassId メンバーに含まれており、関連付けられた表示文字列が lpServiceClassName メンバーによって参照されます。 これは、 WSAGetServiceClassNameByClassId 関数によって返される文字列です。
WSASERVICECLASSINFO 構造体の lpClassInfos メンバーは、WSANSCLASSINFO 構造体の配列を参照します。各構造体は、指定された名前空間に適用される名前付きメンバーと型指定されたメンバーを提供します。 lpszName メンバーの値の例としては、"SapId"、"TcpPort"、"UdpPort" などがあります。これらの文字列は、通常、dwNameSpace メンバーで識別される名前空間に固有です。 dwValueType メンバーの一般的な値は、REG_DWORD、REG_SZなどです。dwValueSize メンバーは、lpValue が指すデータ項目の長さを示します。
WSAInstallServiceClass 関数が呼び出されると、WSASERVICECLASSINFO 構造体で表されるデータのコレクション全体が各名前空間プロバイダーに提供されます。 その後、各名前空間プロバイダーは WSANSCLASSINFO 構造体の一覧を確認し、それに適用できる情報を保持します。
関連トピック