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

LPNSPSETSERVICE

コールバック

シグネチャ

INT LPNSPSETSERVICE(
    GUID* lpProviderId,
    WSASERVICECLASSINFOW* lpServiceClassInfo,
    WSAQUERYSETW* lpqsRegInfo,
    WSAESETSERVICEOP essOperation,
    DWORD dwControlFlags
);

パラメーター

フィールド型説明
lpProviderIdGUID*サービスが登録される特定の名前空間プロバイダーの GUID へのポインター。
lpServiceClassInfoWSASERVICECLASSINFOW*サービスクラスのスキーマ情報。
lpqsRegInfoWSAQUERYSETW*登録時に更新されるプロパティ情報。
essOperationWSAESETSERVICEOP

要求される操作の種類。

このパラメーターには、Winsock2.h ヘッダーファイルで定義されている WSAESETSERVICEOP 列挙型の値のいずれかを指定できます。

値 意味
RNRSERVICE_REGISTER
0
サービスを登録します。NetWare 環境で使用される Service Advertising Protocol (SAP) 名前空間では、これは定期的なブロードキャストの送信を意味します。Domain Name System (DNS) 名前空間では NOP です。永続的なデータストアでは、アドレス情報の更新を意味します。
RNRSERVICE_DEREGISTER
1
サービスを登録解除します。SAP 名前空間では、これは定期的なブロードキャストの送信を停止することを意味します。DNS 名前空間では NOP です。永続的なデータストアでは、アドレス情報の削除を意味します。
RNRSERVICE_DELETE
2
動的名前空間および永続的な空間からサービスを削除します。複数の CSADDR_INFO 構造体で表されるサービス (SERVICE_MULTIPLE フラグを使用) の場合、指定されたアドレスのみが削除されます。このアドレスは、サービスの登録時に指定された対応する **CSADDR_INFO** 構造体と厳密に一致している必要があります。
dwControlFlagsDWORD

要求されるサービス操作を制御するフラグのセット。

このパラメーターに指定可能な値は、Winsock2.h ヘッダーファイルで定義されています。

値 意味
SERVICE_MULTIPLE
0x00000001
操作のスコープを制御します。

この値が設定されている場合、処理は指定されたアドレスセットに対してのみ実行されます。登録操作は既存のアドレスを無効にせず、登録解除操作は指定されたアドレスセットのみを無効にします。

この値が設定されていない場合、サービスのアドレスはグループとして管理されます。登録または登録解除は、指定されたアドレスセットを追加する前に、既存のすべてのアドレスを無効にします。

公式ドキュメント

NSPSetService 関数は、名前空間内にサービスインスタンスを登録または登録解除します。

戻り値

ルーチンが成功した場合、関数は NO_ERROR (ゼロ) を返します。ルーチンが失敗した場合は SOCKET_ERROR (–1) を返し、 WSASetLastError を使用して適切なエラーコードを設定する必要があります。

エラーコード 意味
WSAEACCES
呼び出し元のルーチンに、サービスをインストールするための十分な権限がありません。
WSA_NOT_ENOUGH_MEMORY
この操作を実行するために利用できるメモリが不足しています。
WSAEINVAL
このプロバイダーに対して、1 つ以上のパラメーターが無効であるか、指定されていません。
WSAEOPNOTSUPP
操作がサポートされていません。名前空間プロバイダーがこの関数を実装していない場合に、このエラーが返されます。
WSASERVICE_NOT_FOUND
サービスが不明です。指定された名前空間内でサービスが見つかりません。

解説(Remarks)

次の表に、essOperation と dwControlFlags に指定可能な値を示します。

操作 フラグ サービスが既に存在する場合 サービスが存在しない場合
**RNRSERVICE_REGISTER** なし オブジェクトを上書きします。指定されたアドレスのみを使用します。オブジェクトは REGISTERED になります。 新しいオブジェクトを作成します。指定されたアドレスのみを使用します。オブジェクトは REGISTERED になります。
**RNRSERVICE_REGISTER** **SERVICE_MULTIPLE** オブジェクトを更新します。既存のセットに新しいアドレスを追加します。オブジェクトは REGISTERED になります。 新しいオブジェクトを作成します。指定されたすべてのアドレスを使用します。オブジェクトは REGISTERED になります。
**RNRSERVICE_DEREGISTER** なし すべてのアドレスを削除しますが、名前空間からオブジェクトは削除しません。オブジェクトは DEREGISTERED になります。 WSASERVICE_NOT_FOUND
**RNRSERVICE_DEREGISTER** **SERVICE_MULTIPLE** オブジェクトを更新します。指定されたアドレスのみを削除します。アドレスが 1 つも残っていない場合にのみ、オブジェクトを DEREGISTERED としてマークします。名前空間からは削除しません。 WSASERVICE_NOT_FOUND
**RNRSERVICE_DELETE** なし 名前空間からオブジェクトを削除します。 WSASERVICE_NOT_FOUND
**RNRSERVICE_DELETE** **SERVICE_MULTIPLE** 指定されたアドレスのみを削除します。アドレスが残っていない場合にのみ、名前空間からオブジェクトを削除します。 WSASERVICE_NOT_FOUND

dwControlFlags パラメーターに SERVICE_MULTIPLE を設定すると、アプリケーションは自身のアドレスを個別に管理できます。これは、アプリケーションがプロトコルを個別に管理する必要がある場合や、サービスが複数のコンピューターに存在する場合に役立ちます。たとえば、サービスが複数のプロトコルを使用している場合、一方のリッスンソケットが異常終了しても、他のソケットは動作を継続できます。この例では、サービスは他のアドレスに影響を与えることなく、異常終了したアドレスを登録解除できます。

SERVICE_MULTIPLE を使用する場合、アプリケーションは古いアドレスをオブジェクト内に残してはなりません。これは、アプリケーションが RNRSERVICE_DEREGISTER 要求を発行せずに異常終了した場合に発生する可能性があります。サービスは登録時に自身のアドレスを保存しておく必要があります。次回の呼び出しでは、新しいアドレスを登録する前に、これらの古いアドレスを明示的に登録解除する必要があります。

サービスプロパティ

次の表は、WSAQUERYSET のメンバー名と、サービスプロパティのデータがどのように表現されるかを示しています。(省略可能) と記載されているメンバーには、null ポインターを指定できます。
WSAQUERYSET のメンバー名 サービスプロパティの説明
**dwSize** sizeof(WSAQUERYSET) を設定します。これはバージョン管理のための仕組みです。
**lpszServiceInstanceName** 参照先の文字列には、サービスインスタンス名が格納されます。
**lpServiceClassId** このサービスクラスに対応する GUID。
**lpVersion** 省略可能。サービスインスタンスのバージョン番号を指定します。
**lpszComment** 省略可能。任意のコメント文字列。
**dwNameSpace** この操作では無視されます。
**lpNSProviderId** この操作では無視されます。プロバイダー識別子は lpProviderId パラメーターに格納されます。
**lpszContext** 省略可能。階層型名前空間におけるクエリの開始位置。
**dwNumberOfProtocols** この操作では無視されます。
**lpafpProtocols** この操作では無視されます。
**pszQueryString** この操作では無視されます。
**dwNumberOfCsAddrs** lpcsaBuffer が参照する CSADDR_INFO 構造体の配列の要素数。
**lpcsaBuffer** サービスがリッスンしているアドレスを格納した CSADDR_INFO 構造体の配列へのポインター。
**dwOutputFlags** この操作では無視されます。
**lpBlob** 省略可能。プロバイダー固有のエンティティへのポインター。
**注** CSADDR_INFO 構造体の **iProtocol** メンバーには、ワイルドカード値を示すマニフェスト定数 **IPROTOCOL_ANY** を格納してもかまいません。名前空間プロバイダーは、指定されたアドレスファミリとソケットタイプに適した値に置き換える必要があります。
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)