WSASocketW 関数 (winsock2.h)

WSASocket 関数は、特定のトランスポート サービス プロバイダーにバインドされたソケットを作成します。

構文

SOCKET WSAAPI WSASocketW(
  [in] int                 af,
  [in] int                 type,
  [in] int                 protocol,
  [in] LPWSAPROTOCOL_INFOW lpProtocolInfo,
  [in] GROUP               g,
  [in] DWORD               dwFlags
);

パラメーター

[in] af

アドレス ファミリの仕様。 アドレス ファミリに使用できる値は、 Winsock2.h ヘッダー ファイルで定義されています。

Windows Vista 以降用にリリースされた Windows SDK では、ヘッダー ファイルのorganizationが変更され、アドレス ファミリの使用可能な値が Ws2def.h ヘッダー ファイルで定義されます。 Ws2def.h ヘッダー ファイルは Winsock2.h に自動的に含まれるので、直接使用しないでください。

現在サポートされている値は、IPv4 と IPv6 のインターネット アドレス ファミリ形式であるAF_INETまたはAF_INET6です。 アドレス ファミリの Windows ソケット サービス プロバイダーがインストールされている場合、アドレス ファミリのその他のオプション (NetBIOS で使用するためのAF_NETBIOSなど) がサポートされます。 AF_ アドレス ファミリ定数とPF_ プロトコル ファミリ定数の値は同一であるため ( たとえば、AF_INETPF_INET)、どちらの定数も使用できます。

次の表に、アドレス ファミリの一般的な値を示しますが、他の多くの値を使用できます。

Af 意味
AF_UNSPEC
0
アドレス ファミリが指定されていません。
AF_INET
2
インターネット プロトコル バージョン 4 (IPv4) アドレス ファミリ。
AF_IPX
6
IPX/SPX アドレス ファミリ。 このアドレス ファミリは、NWLink IPX/SPX NetBIOS 互換トランスポート プロトコルがインストールされている場合にのみサポートされます。

このアドレス ファミリは、Windows Vista 以降ではサポートされていません。

AF_APPLETALK
16
AppleTalk アドレス ファミリ。 このアドレス ファミリは、AppleTalk プロトコルがインストールされている場合にのみサポートされます。

このアドレス ファミリは、Windows Vista 以降ではサポートされていません。

AF_NETBIOS
17
NetBIOS アドレス ファミリ。 このアドレス ファミリは、NetBIOS 用 Windows ソケット プロバイダーがインストールされている場合にのみサポートされます。

NetBIOS 用 Windows ソケット プロバイダーは、32 ビット バージョンの Windows でサポートされています。 このプロバイダーは、既定で 32 ビット バージョンの Windows にインストールされます。

NetBIOS 用 Windows ソケット プロバイダーは、Windows 7、Windows Server 2008、Windows Vista、Windows Server 2003、または Windows XP を含む 64 ビット バージョンの Windows ではサポートされていません。

NetBIOS 用 Windows ソケット プロバイダーは、 パラメーターが SOCK_DGRAM に設定されているソケットのみをサポートします。

NetBIOS 用 Windows ソケット プロバイダーは、 NetBIOS プログラミング インターフェイスとは直接関係ありません。 NetBIOS プログラミング インターフェイスは、Windows Vista、Windows Server 2008 以降ではサポートされていません。

AF_INET6
23
インターネット プロトコル バージョン 6 (IPv6) アドレス ファミリ。
AF_IRDA
26
赤外線データ関連付け (IrDA) アドレス ファミリ。

このアドレス ファミリは、コンピューターに赤外線ポートとドライバーがインストールされている場合にのみサポートされます。

AF_BTH
32
Bluetooth アドレス ファミリ。

このアドレス ファミリは、コンピューターに Bluetooth アダプターとドライバーがインストールされている場合、SP2 以降の Windows XP でサポートされます。

[in] type

新しいソケットの型指定。

ソケットの種類に使用できる値は、 Winsock2.h ヘッダー ファイルで定義されています。

次の表に、Windows ソケット 2 でサポートされている パラメーターに使用できる値を示します。

Type 説明
Sock_stream
1
OOB データ転送メカニズムを使用して、シーケンス化された信頼性の高い双方向の接続ベースのバイト ストリームを提供するソケット型。 このソケットの種類では、インターネット アドレス ファミリ (AF_INET または AF_INET6) に伝送制御プロトコル (TCP) が使用されます。
SOCK_DGRAM
2
固定 (通常は小さい) 最大長のコネクションレスで信頼性の低いバッファーであるデータグラムをサポートするソケット型。 このソケットの種類では、インターネット アドレス ファミリ (AF_INETまたはAF_INET6) にユーザー データグラム プロトコル (UDP) が使用されます。
SOCK_RAW
3
アプリケーションが次の上位層プロトコル ヘッダーを操作できるようにする生のソケットを提供するソケットの種類。 IPv4 ヘッダーを操作するには、 ソケットで IP_HDRINCL ソケット オプションを設定する必要があります。 IPv6 ヘッダーを操作するには、 ソケットで IPV6_HDRINCL ソケット オプションを設定する必要があります。
SOCK_RDM
4
信頼性の高いメッセージ データグラムを提供するソケットの種類。 この種類の例として、Windows でのプラグマティック一般マルチキャスト (PGM) マルチキャスト プロトコルの実装があります。これは、多くの場合、 信頼性の高いマルチキャスト プログラミングと呼ばれます。

この の値は、Reliable Multicast Protocol がインストールされている場合にのみサポートされます。

SOCK_SEQPACKET
5
データグラムに基づいて擬似ストリーム パケットを提供するソケットの種類。
 

Windows ソケット 2 では、新しいソケットの種類が導入されました。 アプリケーションは、 WSAEnumProtocols 関数を使用して、使用可能な各トランスポート プロトコルの属性を動的に検出できます。 そのため、アプリケーションはアドレス ファミリに使用可能なソケットの種類とプロトコル オプションを決定し、このパラメーターを指定するときにこの情報を使用できます。 Winsock2.h および Ws2def.h ヘッダー ファイルのソケットの種類の定義は、新しいソケットの種類、アドレス ファミリ、およびプロトコルが定義されると、定期的に更新されます。

Windows Sockets 1.1 では、使用可能なソケットの種類は SOCK_DGRAMSOCK_STREAMのみです。

[in] protocol

使用するプロトコル。 プロトコル パラメーターに使用できるオプションは、指定されたアドレス ファミリとソケットの種類に固有です。 プロトコルに使用できる値は、Winsock2.h ヘッダー ファイルと Wsrm.h ヘッダー ファイルで定義されています。

Windows Vista 以降用にリリースされた Windows SDK では、ヘッダー ファイルのorganizationが変更され、このパラメーターには Ws2def.h ヘッダー ファイルで定義されている IPPROTO 列挙型の値のいずれかを指定できます。 Ws2def.h ヘッダー ファイルは Winsock2.h に自動的に含まれるので、直接使用しないでください。

値 0 を指定した場合、呼び出し元はプロトコルを指定せず、サービス プロバイダーは使用する プロトコル を選択します。

af パラメーターがAF_INETまたはAF_INET6で、タイプSOCK_RAWの場合、プロトコルに指定された値は、IPv6 または IPv4 パケット・ヘッダーのプロトコル・フィールドに設定されます。

プロトコルの一般的な 値を次 の表に示しますが、他の多くの値を使用できます。

protocol 意味
IPPROTO_ICMP
1
インターネット制御メッセージ プロトコル (ICMP)。 これは、af パラメーターがAF_UNSPECAF_INET、またはAF_INET6、型パラメーターがSOCK_RAWまたは指定されていない場合使用できる値です。

この プロトコル 値は、Windows XP 以降でサポートされています。

IPPROTO_IGMP
2
インターネット グループ管理プロトコル (IGMP)。 これは、af パラメーターがAF_UNSPEC、AF_INET、またはAF_INET6、型パラメーターがSOCK_RAWまたは指定されていない場合に使用できる値です。

この プロトコル 値は、Windows XP 以降でサポートされています。

BTHPROTO_RFCOMM
3
Bluetooth 無線周波数通信 (Bluetooth RFCOMM) プロトコル。 af パラメーターがAF_BTHで、type パラメーターがSOCK_STREAMされている場合、これは可能な値です。

この プロトコル 値は、SP2 以降の Windows XP でサポートされています。

IPPROTO_TCP
6
伝送制御プロトコル (TCP)。 これは、af パラメーターがAF_INETまたはAF_INET6、type パラメーターがSOCK_STREAM場合に使用できる値です。
IPPROTO_UDP
17
ユーザー データグラム プロトコル (UDP)。 これは、af パラメーターがAF_INETまたはAF_INET6、typeパラメーターがSOCK_DGRAMされている場合に使用できる値です。
IPPROTO_ICMPV6
58
インターネット制御メッセージ プロトコル バージョン 6 (ICMPv6)。 これは、af パラメーターがAF_UNSPEC、AF_INET、またはAF_INET6、型パラメーターがSOCK_RAWまたは指定されていない場合に使用できる値です。

この プロトコル 値は、Windows XP 以降でサポートされています。

IPPROTO_RM
113
信頼性の高いマルチキャスト用の PGM プロトコル。 これは、af パラメーターがAF_INETで、type パラメーターがSOCK_RDMされている場合に使用できる値です。 Windows Vista 以降用にリリースされた Windows SDK では、このプロトコルは IPPROTO_PGM とも呼ばれます。

この プロトコル 値は、Reliable Multicast Protocol がインストールされている場合にのみサポートされます。

[in] lpProtocolInfo

作成するソケットの特性を定義する WSAPROTOCOL_INFO 構造体へのポインター。 このパラメーターが NULL でない場合、ソケットは、指定された WSAPROTOCOL_INFO 構造体に関連付けられているプロバイダーにバインドされます。

[in] g

新しいソケットと新しいソケット グループを作成するときに実行する既存のソケット グループ ID または適切なアクション。

g が既存のソケット グループ ID の場合は、このグループによって設定されたすべての要件が満たされていれば、新しいソケットをこのソケット グループに参加させます。

g が既存のソケット グループ ID でない場合は、次の値を使用できます。

G 意味
0
グループ操作は実行されません。
SG_UNCONSTRAINED_GROUP
0x01
制約のないソケット グループを作成し、新しいソケットを最初のメンバーにします。 制約のないグループの場合、Winsock では、ソケット グループ内のすべてのソケットが 、型 パラメーターと プロトコル パラメーターに対して同じ値で作成されたという制約はありません。
SG_CONSTRAINED_GROUP
0x02
制約付きソケット グループを作成し、新しいソケットを最初のメンバーにします。 制約付きソケット グループの場合、Winsock はソケット グループ内のすべてのソケットを、 パラメーターと プロトコル パラメーターに同じ値で作成されるように制限します。 制約付きソケット グループは、接続指向ソケットのみで構成される場合があり、グループ化されたすべてのソケットの接続が同じホスト上の同じアドレスに対して行われる必要があります。
 
メモ SG_UNCONSTRAINED_GROUP定数とSG_CONSTRAINED_GROUP定数は、現在パブリック ヘッダー ファイルでは定義されていません。
 

[in] dwFlags

追加のソケット属性を指定するために使用されるフラグのセット。

これらのフラグの組み合わせを設定できますが、一部の組み合わせは許可されません。

意味
WSA_FLAG_OVERLAPPED
0x01
重複した I/O 操作をサポートするソケットを作成します。

ほとんどのソケットは、このフラグを設定して作成する必要があります。 重複するソケットは、重複した I/O 操作に 対して WSASendWSASendToWSARecvWSARecvFromおよび WSAIoctl を利用できます。これにより、複数の操作を同時に開始して進行中にすることができます。

重複する操作 (WSASendWSARecvWSASendToWSARecvFromWSAIoctl) を許可するすべての関数は、重複する操作に関連するパラメーターの値が NULL の場合、重複するソケットでのオーバーラップされていない使用もサポートします。

WSA_FLAG_MULTIPOINT_C_ROOT
0x02
マルチポイント セッションでc_rootになるソケットを作成します。

この属性は、ソケットを作成するトランスポート プロバイダーの WSAPROTOCOL_INFO 構造がマルチポイントまたはマルチキャスト メカニズムをサポートし、マルチポイント セッションのコントロール プレーンがルート化されている場合にのみ許可されます。 これは、XP1_SUPPORT_MULTIPOINTフラグとXP1_MULTIPOINT_CONTROL_PLANEフラグが設定されたWSAPROTOCOL_INFO構造体の dwServiceFlags1 メンバーによって示されます。

lpProtocolInfo パラメーターが NULL でない場合、トランスポート プロバイダーのWSAPROTOCOL_INFO構造体は lpProtocolInfo パラメーターによって指されます。 lpProtocolInfo パラメーターが NULL の場合、WSAPROTOCOL_INFO構造体は aftype、および protocol パラメーターに指定された値によって選択されたトランスポート プロバイダーに基づきます。

マルチポイント セッションの詳細については、「 マルチポイントとマルチキャストのセマンティクス 」を参照してください。

WSA_FLAG_MULTIPOINT_C_LEAF
0x04
マルチポイント セッションでc_leafになるソケットを作成します。

この属性は、ソケットを作成するトランスポート プロバイダーの WSAPROTOCOL_INFO 構造がマルチポイントまたはマルチキャスト メカニズムをサポートし、マルチポイント セッションのコントロール プレーンがルート化されていない場合にのみ許可されます。 これは、XP1_SUPPORT_MULTIPOINT フラグが設定され、XP1_MULTIPOINT_CONTROL_PLANE フラグが設定されていないWSAPROTOCOL_INFO構造体のdwServiceFlags1 メンバーによって示されます。

lpProtocolInfo パラメーターが NULL でない場合、トランスポート プロバイダーのWSAPROTOCOL_INFO構造体は lpProtocolInfo パラメーターによって指されます。 lpProtocolInfo パラメーターが NULL の場合、WSAPROTOCOL_INFO構造体は aftype、および protocol パラメーターに指定された値によって選択されたトランスポート プロバイダーに基づきます。

マルチポイント セッションの詳細については、「 マルチポイントとマルチキャストのセマンティクス 」を参照してください。

WSA_FLAG_MULTIPOINT_D_ROOT
0x08
マルチポイント セッションでd_rootになるソケットを作成します。

この属性は、ソケットを作成するトランスポート プロバイダーの WSAPROTOCOL_INFO 構造がマルチポイントまたはマルチキャスト メカニズムをサポートし、マルチポイント セッションのデータ プレーンがルート化されている場合にのみ許可されます。 これは、XP1_SUPPORT_MULTIPOINTフラグとXP1_MULTIPOINT_DATA_PLANEフラグが設定されたWSAPROTOCOL_INFO構造体の dwServiceFlags1 メンバーによって示されます。

lpProtocolInfo パラメーターが NULL でない場合、トランスポート プロバイダーのWSAPROTOCOL_INFO構造体は lpProtocolInfo パラメーターによって指されます。 lpProtocolInfo パラメーターが NULL の場合、WSAPROTOCOL_INFO構造体は aftype、および protocol パラメーターに指定された値によって選択されたトランスポート プロバイダーに基づきます。

マルチポイント セッションの詳細については、「 マルチポイントとマルチキャストのセマンティクス 」を参照してください。

WSA_FLAG_MULTIPOINT_D_LEAF
0x10
マルチポイント セッションでd_leafになるソケットを作成します。

この属性は、ソケットを作成するトランスポート プロバイダーの WSAPROTOCOL_INFO 構造がマルチポイントまたはマルチキャスト メカニズムをサポートし、マルチポイント セッションのデータ プレーンがルート化されていない場合にのみ許可されます。 これは、XP1_SUPPORT_MULTIPOINT フラグが設定され、XP1_MULTIPOINT_DATA_PLANE フラグが設定されていないWSAPROTOCOL_INFO構造体のdwServiceFlags1 メンバーによって示されます。

lpProtocolInfo パラメーターが NULL でない場合、トランスポート プロバイダーのWSAPROTOCOL_INFO構造体は lpProtocolInfo パラメーターによって指されます。 lpProtocolInfo パラメーターが NULL の場合、WSAPROTOCOL_INFO構造体は aftype、および protocol パラメーターに指定された値によって選択されたトランスポート プロバイダーに基づきます。

マルチポイント セッションの詳細については、「 マルチポイントとマルチキャストのセマンティクス 」を参照してください。

WSA_FLAG_ACCESS_SYSTEM_SECURITY
0x40
任意のアクセス制御リスト (DACL) ではなく、セキュリティ アクセス制御リスト (SACL) を含むソケットにセキュリティ記述子を設定できるソケットを作成します。

SACL は、オブジェクトでアクセスチェックが発生したときに監査とアラームを生成するために使用されます。 ソケットの場合、アクセスチェックが発生して、ソケットがバインド関数に指定された特定のアドレスへのバインドを許可される必要があるかどうかを判断します。

ACCESS_SYSTEM_SECURITYアクセス権は、オブジェクトのセキュリティ記述子で SACL を取得または設定する機能を制御します。 システムは、要求スレッドのアクセス トークンで SE_SECURITY_NAME 特権が有効になっている場合にのみ、このアクセス権を付与します。

WSA_FLAG_NO_HANDLE_INHERIT
0x80
継承できないソケットを作成します。

WSASocket またはソケット関数によって作成されたソケット ハンドルは、既定で継承可能です。 このフラグを設定すると、ソケット ハンドルは継承できません。

GetHandleInformation 関数を使用して、WSA_FLAG_NO_HANDLE_INHERIT フラグが設定されたソケット ハンドルが作成されたかどうかを判断できます。 GetHandleInformation 関数は、HANDLE_FLAG_INHERIT値が設定されていることを返します。

このフラグは、WINDOWS 7 SP1、Windows Server 2008 R2 SP1 以降でサポートされています

 
大事な マルチポイント ソケットの場合、 WSA_FLAG_MULTIPOINT_C_ROOT フラグまたは WSA_FLAG_MULTIPOINT_C_LEAF フラグの 1 つだけを指定でき、 WSA_FLAG_MULTIPOINT_D_ROOT または WSA_FLAG_MULTIPOINT_D_LEAF フラグのいずれかを指定できます。 詳細については、「 マルチポイントとマルチキャストのセマンティクス 」を参照してください。
 

戻り値

エラーが発生しない場合、 WSASocket は新しいソケットを参照する記述子を返します。 それ以外の場合は、INVALID_SOCKETの値が返され、 WSAGetLastError を呼び出すことによって特定のエラー コードを取得できます。

メモ このエラー コードの説明は Microsoft 固有です。
 
エラー コード 意味
WSANOTINITIALIZED
この関数を使用する前に 、WSAStartup 呼び出しが正常に行われる必要があります。
WSAENETDOWN
ネットワーク サブシステムが失敗しました。
WSAEAFNOSUPPORT
指定されたアドレス ファミリはサポートされていません。
WSAEFAULT
lpProtocolInfo パラメーターがプロセス・アドレス・スペースの有効な部分にありません。
WSAEINPROGRESS
ブロックしている Windows ソケット 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。
WSAEINVAL
この値は、次のいずれかの条件に当てはまります。
  • 指定されたパラメーター g が無効です。
  • lpProtocolInfo が指すWSAPROTOCOL_INFO構造体が不完全であるか、内容が無効であるか、以前の重複するソケット操作でWSAPROTOCOL_INFO構造体が既に使用されています。
  • ソケット トリプル <aftype、および protocol> のメンバーに指定された値は個別にサポートされていますが、指定された組み合わせはサポートされていません。
WSAEINVALIDPROVIDER
サービス プロバイダーから 2.2 以外のバージョンが返されました。
WSAEINVALIDPROCTABLE
サービス プロバイダーから WSPStartup に無効なプロシージャ テーブルまたは不完全なプロシージャ テーブルが返されました。
WSAEMFILE
これ以上使用できるソケット記述子がありません。
WSAENOBUFS
バッファーに空き領域がありません。 ソケットを作成できません。
WSAEPROTONOSUPPORT
指定されたプロトコルはサポートされません。
WSAEPROTOTYPE
指定されたプロトコルがこのソケットに対して正しくない型です。
WSAEPROVIDERFAILEDINIT
サービス プロバイダーの初期化に失敗しました。 このエラーは、階層型サービス プロバイダー (LSP) または名前空間プロバイダーが正しくインストールされていない場合、またはプロバイダーが正しく動作しなかった場合に返されます。
WSAESOCKTNOSUPPORT
指定されたソケットの種類は、このアドレス ファミリではサポートされていません。

注釈

WSASocket 関数を使用すると、ソケット記述子と関連リソースが割り当てられ、トランスポート サービス プロバイダーに関連付けられます。 ほとんどのソケットは、dwFlags パラメーターに設定された WSA_FLAG_OVERLAPPED 属性を使用して作成する必要があります。 この属性を使用して作成されたソケットでは、パフォーマンスを向上させる重複した I/O 操作の使用がサポートされています。 既定では、 WSASocket 関数で作成されたソケットには、この重複する属性は設定されません。 これに対し、 ソケット 関数は、重複した I/O 操作を既定の動作としてサポートするソケットを作成します。

lpProtocolInfo パラメーターが NULL の場合、Winsock は、aftype、および protocol パラメーターで指定されたアドレス ファミリ、ソケットの種類、プロトコルの要求された組み合わせをサポートする最初の使用可能なトランスポート サービス プロバイダーを利用します。

lpProtocolInfo パラメーターが NULL でない場合、ソケットは、指定されたWSAPROTOCOL_INFO構造体に関連付けられているプロバイダーにバインドされます。 この場合、アプリケーションは、aftype、またはプロトコルのパラメーターの値としてマニフェスト定数FROM_PROTOCOL_INFOを指定できます。 これは、指定された WSAPROTOCOL_INFO 構造体 (iAddressFamilyiSocketTypeiProtocol) の対応する値が想定されることを示します。 いずれの場合も、 aftype、および protocol に指定された値は、変更されていない状態でトランスポート サービス プロバイダーに渡されます。

aftype、および protocol に基づいてプロトコルとそのサポート サービス プロバイダーを選択する場合、この手順では、プロトコルレイヤー自体ではなく、基本プロトコルまたはプロトコル チェーンのみを選択します。 非チェーン プロトコル レイヤーは、 または af に部分的な一致があるとは見なされません。 つまり、適切なプロトコルが見つからない場合、 WSAEAFNOSUPPORT または WSAEPROTONOSUPPORT のエラー コードは発生しません。

メモ マニフェスト定数 AF_UNSPEC は引き続きヘッダー ファイルで定義されますが、 プロトコル パラメーターの値を解釈する際にあいまいさが生じる可能性があるため、その使用は強くお勧めしません。
 
アプリケーションでは、af パラメーターにAF_INET6を使用し、IPv4 と IPv6 の両方で使用できるデュアルモード ソケットを作成することをお勧めします。

WSASocket 関数を使用してソケットを作成する場合、dwFlags パラメーターには、SO_RCVTIMEOまたはSO_SNDTIMEOソケット オプションを正しく機能させるために、WSA_FLAG_OVERLAPPED属性が設定されている必要があります。 それ以外の場合、タイムアウトはソケットに対して有効になりません。

SOCK_STREAMなどの接続指向ソケットは、全二重接続を提供し、データを送受信する前に接続状態である必要があります。 指定されたソケットへの接続は、 connect 関数呼び出しまたは WSAConnect 関数呼び出しによって確立されます。 接続されると、WSASend送信/とWSARecv 呼び出し/使用してデータを転送できます。 セッションが完了したら、 closesocket 関数を呼び出して、ソケットに関連付けられているリソースを解放する必要があります。 接続指向ソケットの場合は、closesocket 関数を呼び出す前に、ソケットでのデータ転送を停止するためにシャットダウン関数を呼び出す必要があります。

信頼性の高い接続指向ソケットを実装するために使用される通信プロトコルにより、データが失われたり重複したりすることがないようにします。 ピア プロトコルにバッファー領域があるデータを適切な時間内に正常に送信できない場合、接続は切断されたと見なされ、その後の呼び出しは WSAETIMEDOUT に設定されたエラー コードで失敗します。

コネクションレスのメッセージ指向ソケットを使用すると、 sendto/WSASendTorecvfrom/WSARecvFrom を使用して、任意のピアとの間でデータグラムを送受信できます。 このようなソケットが特定のピアに接続されている場合、データグラムは送信WSASendを使用してその/ピアに送信でき、recv/WSARecv を使用してこのピアから (のみ) 受信できます。

SOCK_RAW型のソケットのサポートは必要ありませんが、サービス プロバイダーは可能な限り生のソケットをサポートすることをお勧めします。

WSASocket 関数を使用すると、サービスで使用されるソケットを作成して、別のソケットがサービスで使用されているのと同じポートにバインドしようとして監査レコードが生成されるようにすることができます。 このオプションを有効にするには、アプリケーションで次の操作を行う必要があります。

  • AdjustTokenPrivileges 関数を呼び出して、プロセスのアクセス トークンでSE_SECURITY_NAME特権を有効にします。 この特権は、オブジェクトのセキュリティ記述子に 対するACCESS_SYSTEM_SECURITY アクセス権を設定するために必要です。
  • wsASocket 関数を呼び出して、WSA_FLAG_ACCESS_SYSTEM_SECURITY オプションが設定された dwFlag を使用してソケットを作成します。 この操作に必要なSE_SECURITY_NAME特権を有効にするために AdjustTokenPrivileges 関数が最初に呼び出されない場合、WSASocket 関数は失敗します。
  • SetSecurityInfo 関数を呼び出して、ソケット上の System Access Control List (SACL) を使用してセキュリティ記述子を設定します。 WSASocket 関数によって返されるソケット ハンドルは、handle パラメーターに渡されます。 関数が成功すると、ソケットのセキュリティ記述子に 対するACCESS_SYSTEM_SECURITY アクセス権が設定されます。
  • bind 関数を呼び出して、ソケットを特定のポートにバインドします。 バインド関数が成功すると、別のソケットが同じポートへのバインドを試みると、監査エントリが生成されます。
  • AdjustTokenPrivileges 関数を呼び出して、プロセスのアクセス トークンのSE_SECURITY_NAME特権を削除します。これは不要になったためです。

ACCESS_SYSTEM_SECURITYの詳細については、承認ドキュメントの SACL アクセス権監査生成に関するページを参照してください。

ソケット グループ

WinSock 2 では、ソケット グループの概念をアプリケーションの手段として導入しました。つまり、連携するアプリケーションのセットは、特定のソケットセットが関連しており、このように形成されたグループが特定の属性を持っていることを基になるサービス プロバイダーに示します。 グループ属性には、グループ内の個々のソケットの相対的な優先順位と、グループのサービス品質の仕様が含まれます。

ネットワーク経由でマルチメディア ストリームを交換する必要があるアプリケーションは、ソケットのセット間で特定の関係を確立できる場合に役立つ可能性がある例です。 ソケット グループの処理方法については、トランスポートに依存します。

WSASocket 関数と WSAAccept 関数を使用して、新しいソケットの作成時にソケット グループを明示的に作成および結合できます。 ソケットのソケット グループ ID は、level パラメーターが SOL_SOCKET に設定され、optname パラメーターが SO_GROUP_ID に設定された getsockopt 関数を使用して取得できます。 ソケット グループとそれに関連付けられているソケット グループ ID は、このソケット グループに属する最後のソケットが閉じられるまで有効なままです。 ソケット グループ ID は、特定のサービス プロバイダーのすべてのプロセスで一意です。 0 のソケット グループは、ソケットがソケット グループのメンバーではないことを示します。

ソケット グループの相対グループ優先度にアクセスするには、 getsockopt 関数を使用し、 level パラメーターを SOL_SOCKET に設定し、 optname パラメーターを SO_GROUP_PRIORITY に設定します。 ソケット グループの相対グループ優先度は、 setockopt を使用して level パラメーターを SOL_SOCKET に設定し、 optname パラメーターを SO_GROUP_PRIORITY に設定することで設定できます。

Windows に含まれる Winsock プロバイダーでは、ソケット グループを作成でき、SG_CONSTRAINED_GROUPが適用されます。 制約付きソケット グループ内のすべてのソケットは、 パラメーターと プロトコル パラメーターに対して同じ値で作成する必要があります。 制約付きソケット グループは、接続指向のソケットのみで構成できます。また、グループ化されたすべてのソケットの接続は、同じホスト上の同じアドレスに対して行う必要があります。 これは、Windows に含まれる Winsock プロバイダーによってソケット グループに適用される唯一の制限です。 ソケット グループの優先度は、現在、Winsock プロバイダーまたは Windows に含まれる TCP/IP スタックでは使用されていません。

コード例

次の例では、 WSASocket 関数の使用方法を示します。
#ifndef UNICODE
#define UNICODE 1
#endif

// link with Ws2_32.lib
#pragma comment(lib,"Ws2_32.lib")

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>   // Needed for _wtoi


int __cdecl wmain(int argc, wchar_t **argv)
{

    //-----------------------------------------
    // Declare and initialize variables
    WSADATA wsaData = {0};
    int iResult = 0;

//    int i = 1;

    SOCKET sock = INVALID_SOCKET;
    int iFamily = AF_UNSPEC;
    int iType = 0;
    int iProtocol = 0;
    DWORD dwFlags = 0;

    // Validate the parameters
    if (argc != 5) {
        wprintf(L"usage: %s <addressfamily> <type> <protocol> <flags>\n", argv[0]);
        wprintf(L"       opens a socket for the specified family, type, protocol, and flags\n");
        wprintf(L"       flags value must be in decimal, not hex\n");
        wprintf(L"%ws example usage\n", argv[0]);
        wprintf(L"   %ws 0 2 17 1\n", argv[0]);
        wprintf(L"   where AF_UNSPEC=0 SOCK_DGRAM=2 IPPROTO_UDP=17 OVERLAPPED\n", argv[0]);
        return 1;
    }

    iFamily = _wtoi(argv[1]);
    iType = _wtoi(argv[2]);
    iProtocol = _wtoi(argv[3]);
    dwFlags = _wtoi(argv[4]);
    
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        wprintf(L"WSAStartup failed: %d\n", iResult);
        return 1;
    }

    wprintf(L"Calling socket with following parameters:\n");
    wprintf(L"  Address Family = ");
    switch (iFamily) {
    case AF_UNSPEC:
        wprintf(L"Unspecified");
        break;
    case AF_INET:
        wprintf(L"AF_INET (IPv4)");
        break;
    case AF_INET6:
        wprintf(L"AF_INET6 (IPv6)");
        break;
    case AF_NETBIOS:
        wprintf(L"AF_NETBIOS (NetBIOS)");
        break;
    case AF_BTH:
        wprintf(L"AF_BTH (Bluetooth)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iFamily);
    
    wprintf(L"  Socket type = ");
    switch (iType) {
    case 0:
        wprintf(L"Unspecified");
        break;
    case SOCK_STREAM:
        wprintf(L"SOCK_STREAM (stream)");
        break;
    case SOCK_DGRAM:
        wprintf(L"SOCK_DGRAM (datagram)");
        break;
    case SOCK_RAW:
        wprintf(L"SOCK_RAW (raw)");
        break;
    case SOCK_RDM:
        wprintf(L"SOCK_RDM (reliable message datagram)");
        break;
    case SOCK_SEQPACKET:
        wprintf(L"SOCK_SEQPACKET (pseudo-stream packet)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iType);

    wprintf(L"  Protocol = %d = ", iProtocol);
    switch (iProtocol) {
    case 0:
        wprintf(L"Unspecified");
        break;
    case IPPROTO_ICMP:
        wprintf(L"IPPROTO_ICMP (ICMP)");
        break;
    case IPPROTO_IGMP:
        wprintf(L"IPPROTO_IGMP (IGMP)");
        break;
    case IPPROTO_TCP:
        wprintf(L"IPPROTO_TCP (TCP)");
        break;
    case IPPROTO_UDP:
        wprintf(L"IPPROTO_UDP (UDP)");
        break;
    case IPPROTO_ICMPV6:
        wprintf(L"IPPROTO_ICMPV6 (ICMP Version 6)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iProtocol);

    wprintf(L"  Flags = ");
    if (dwFlags & WSA_FLAG_OVERLAPPED)
        wprintf(L"  WSA_FLAG_OVERLAPPED");
    if (dwFlags & WSA_FLAG_MULTIPOINT_C_ROOT)
        wprintf(L"  WSA_FLAG_MULTIPOINT_C_ROOT");
    if (dwFlags & WSA_FLAG_MULTIPOINT_C_LEAF)
        wprintf(L"  WSA_FLAG_MULTIPOINT_C_LEAF");
    if (dwFlags & WSA_FLAG_MULTIPOINT_D_ROOT)
        wprintf(L"  WSA_FLAG_MULTIPOINT_D_ROOT");
    if (dwFlags & WSA_FLAG_MULTIPOINT_D_LEAF)
        wprintf(L"  WSA_FLAG_MULTIPOINT_D_LEAF");
    if (dwFlags & WSA_FLAG_ACCESS_SYSTEM_SECURITY)
        wprintf(L"  WSA_FLAG_ACCESS_SYSTEM_SECURITY");
#ifdef WSA_FLAG_NO_HANDLE_INHERIT 
    if (dwFlags & WSA_FLAG_NO_HANDLE_INHERIT)
        wprintf(L"  WSA_FLAG_NO_HANDLE_INHERIT");
#endif
    wprintf(L" (0x%x)\n" , dwFlags);

    sock = WSASocket(iFamily, iType, iProtocol, NULL, 0, dwFlags);
    if (sock == INVALID_SOCKET) 
        wprintf(L"WSASocket function failed with error = %d\n", WSAGetLastError() );
    else {
        wprintf(L"WSASocket function succeeded\n");

        // Close the socket to release the resources associated
        // Normally an application calls shutdown() before closesocket 
        //   to  disables sends or receives on a socket first
        // This isn't needed in this simple sample
        iResult = closesocket(sock);
        if (iResult == SOCKET_ERROR) {
            wprintf(L"closesocket function zfailed with error = %d\n", WSAGetLastError() );
            WSACleanup();
            return 1;
        }    
    }
    WSACleanup();

    return 0;
}


Windows Phone 8:WSASocketW 関数は、Windows Phone 8 以降のWindows Phone ストア アプリでサポートされています。

Windows 8.1およびWindows Server 2012 R2: WSASocketW 関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストア アプリでサポートされています。

注意

winsock2.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして WSASocket を定義します。 encoding-neutral エイリアスの使用を encoding-neutral ではないコードと混在すると、コンパイル エラーまたはランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「 関数プロトタイプの規則」を参照してください。

要件

   
サポートされている最小のクライアント Windows 8.1、Windows Vista [デスクトップ アプリ |UWP アプリ]
サポートされている最小のサーバー Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ]
対象プラットフォーム Windows
ヘッダー winsock2.h
Library Ws2_32.lib
[DLL] Ws2_32.dll

こちらもご覧ください

WSAPROTOCOL_INFO

Winsock 関数

Winsock リファレンス

accept

bind

closesocket

connect

getsockname

getsockopt

ioctlsocket

listen

Recv

recvfrom

select

送信

Sendto

setsockopt

shutdown

socket