次の方法で共有


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 では、ヘッダー ファイルの編成が変更され、アドレス ファミリの使用可能な値は、Ws2def.h ヘッダー ファイルで定義されます。 Ws2def.h ヘッダー ファイルは winsock2.h自動的に含まれるので、直接使用しないでください。

現在サポートされている値は AF_INET または AF_INET6 です。これは、IPv4 および IPv6 のインターネット アドレス ファミリ形式です。 アドレス ファミリの 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 でサポートされている パラメーターに使用できる値を示します。

種類 意味
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 でのプラグマティック一般マルチキャスト (UWP) マルチキャスト プロトコルの実装が挙 、信頼性の高いマルチキャスト プログラミングと呼ばれます。

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

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

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

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

[in] protocol

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

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

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

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

次の表は、他の多くの値が可能ですが、プロトコル の一般的な値を示しています。

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

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

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

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

BTHPROTO_RFCOMM
3
Bluetooth無線周波数通信 (Bluetooth RFCOMM) プロトコル。 これは、af パラメーターが AF_BTH され、 パラメーターが SOCK_STREAM場合に使用できる値です。

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

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

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

IPPROTO_RM
113
信頼性の高いマルチキャスト用の PGM プロトコル。 これは、af パラメーターが AF_INET され、 パラメーターが 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 操作をサポートするソケットを作成します。

ほとんどのソケットは、このフラグを設定して作成する必要があります。 重複するソケットは、WSASend、WSASendTo、WSARecv、WSARecvFrom、および WSAIoctl を して、複数の操作を同時に開始して進行中にできるようにする、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 構造体は、af、およびプロトコル パラメーターに指定された値によって選択 トランスポート プロバイダーに基づきます。

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

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 構造体は、af、およびプロトコル パラメーターに指定された値によって選択 トランスポート プロバイダーに基づきます。

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

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 構造体は、af、およびプロトコル パラメーターに指定された値によって選択 トランスポート プロバイダーに基づきます。

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

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 構造体は、af、およびプロトコル パラメーターに指定された値によって選択 トランスポート プロバイダーに基づきます。

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

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 フラグの 1 つだけを指定できます。 詳細については、「マルチポイントおよびマルチキャスト セマンティクスの」を参照してください。
 

戻り値

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

このエラー コードの説明は Microsoft 固有です。
 
エラー コード 意味
WSANOTINITIALIZED の
WSAStartup 呼び出し 成功してから、この関数を使用する必要があります。
WSAENETDOWN の
ネットワーク サブシステムが失敗しました。
WSAEAFNOSUPPORT の
指定されたアドレス ファミリはサポートされていません。
WSAEFAULT の
lpProtocolInfo パラメーターが、プロセス・アドレス・スペースの有効な部分にありません。
WSAEINPROGRESS を する
ブロックしている Windows ソケット 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。
WSAEINVAL の
この値は、次のいずれかの条件に当てはまります。
  • 指定 g パラメーターが無効です。
  • lpProtocolInfo が指 WSAPROTOCOL_INFO 構造体が不完全であるか、内容が無効であるか、WSAPROTOCOL_INFO 構造体が以前の重複ソケット操作で既に使用されています。
  • ソケット トリプル <af、および プロトコル> のメンバーに対して指定された値は個別にサポートされますが、指定された組み合わせはサポートされていません。
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 は、af、および プロトコル パラメーターで指定されたアドレス ファミリ、ソケットの種類、プロトコルの要求された組み合わせをサポートする最初の使用可能なトランスポート サービス プロバイダーを利用します。

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

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

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

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

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

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

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

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

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

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

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

ソケット グループ

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

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

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

ソケット グループの相対グループ優先順位には、getsockopt 関数を使用し、レベルの パラメーターを SOL_SOCKET に設定し、optname パラメーターを SO_GROUP_PRIORITYに設定します。 ソケット・グループの相対グループ優先順位は、レベルの パラメーターを SOL_SOCKET に設定し、optname パラメーターを SO_GROUP_PRIORITYに設定した setsockopt を使用して設定できます。

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: windows 8.1、Windows Server 2012 R2 以降の Windows ストア アプリでは、WSASocketW 機能がサポートされています。

手記

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

必要条件

要件 価値
サポートされる最小クライアント Windows 8.1、Windows Vista [デスクトップ アプリ |UWP アプリ]
サポートされる最小サーバー Windows Server 2003 [デスクトップ アプリ |UWP アプリ]
ターゲット プラットフォーム の ウィンドウズ
ヘッダー winsock2.h
ライブラリ Ws2_32.lib
DLL Ws2_32.dll

関連項目

WSAPROTOCOL_INFO

Winsock Functions

Winsock リファレンス

を受け入れる

バインド

closesocket を閉じる

接続

getsockname

getsockopt

ioctlsocket を する

をリッスンする

recv を する

から recv を する

を選択

を送信

sendto を する

setsockopt

シャットダウン の

ソケット