WSASocketA 関数 (winsock2.h)

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

構文

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

パラメーター

[in] af

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

Windows Vista 以降用にリリースされた Windows SDK では、ヘッダー ファイルの編成が変更され、アドレス ファミリの使用可能な値は 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 ソケット 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 パケット ヘッダーのプロトコル フィールドに設定されます。

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

protocol 意味
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 され、 type パラメーターが 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
信頼性の高いマルチキャスト用の PTR プロトコル。 これは、 af パラメーターが AF_INET され、 パラメーターが SOCK_RDMされている場合に使用できる値です。 Windows Vista 以降用にリリースされた Windows SDK では、このプロトコルは IPPROTO_PGM とも呼ばれます。

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

[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 操作に対して WSASendWSASendToWSARecvFromWSAIoctl を利用できます。これにより、複数の操作を同時に開始して進行中にすることができます。

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

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

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

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

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

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

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

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

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値が設定されていることを返します。

このフラグは、SP1 の Windows 7、SP1 を使用した Windows Server 2008 R2、およびそれ以降でサポートされています

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

lpProtocolInfo パラメーターが NULL でない場合、ソケットは、指定されたWSAPROTOCOL_INFO構造体に関連付けられているプロバイダーにバインドされます。 この場合、アプリケーションは、af、、またはプロトコルのパラメーターの値としてマニフェスト定数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送信/呼び出しと recv/WSARecv 呼び出しを使用してデータを転送できます。 セッションが完了したら、ソケットに関連付けられているリソースを解放するために closesocket 関数を呼び出す必要があります。 接続指向ソケットの場合は、closesocket 関数を呼び出す前に、ソケットでのデータ転送を停止するためにシャットダウン関数を呼び出す必要があります。

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

コネクションレスのメッセージ指向ソケットを使用すると、 sendto/WSASendTo および recvfrom/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 アクセス権が設定されます。
  • バインド関数を呼び出して、ソケットを特定のポートにバインドします。 バインド関数が成功した場合、別のソケットが同じポートにバインドしようとすると、監査エントリが生成されます。
  • AdjustTokenPrivileges 関数を呼び出して、プロセスのアクセス トークンのSE_SECURITY_NAME特権を削除します。これは不要になるためです。

ACCESS_SYSTEM_SECURITYの詳細については、承認ドキュメントの SACL Access Right and Audit Generation を参照してください。

ソケット グループ

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

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

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

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

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

要件

   
サポートされている最小のクライアント 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