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 ヘッダー ファイルで定義されます。
現在サポートされている値は AF_INET または AF_INET6 です。これは、IPv4 および IPv6 のインターネット アドレス ファミリ形式です。 アドレス ファミリの Windows ソケット サービス プロバイダーがインストールされている場合、アドレス ファミリのその他のオプション (たとえば、NetBIOS で使用するためのAF_NETBIOS) がサポートされます。 AF_ アドレス ファミリ定数と PF_ プロトコル ファミリ定数の値は同じ (たとえば、AF_INET と PF_INET) ので、どちらの定数も使用できます。
次の表に、アドレス ファミリの一般的な値を示しますが、その他の多くの値も可能です。
Af | 意味 |
---|---|
|
アドレス ファミリは指定されていません。 |
|
インターネット プロトコル バージョン 4 (IPv4) アドレス ファミリ。 |
|
IPX/SPX アドレス ファミリ。 このアドレス ファミリは、NWLink IPX/SPX NetBIOS 互換トランスポート プロトコルがインストールされている場合にのみサポートされます。
このアドレス ファミリは、Windows Vista 以降ではサポートされていません。 |
|
AppleTalk アドレス ファミリ。 このアドレス ファミリは、AppleTalk プロトコルがインストールされている場合にのみサポートされます。
このアドレス ファミリは、Windows Vista 以降ではサポートされていません。 |
|
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 以降ではサポートされていません。 |
|
インターネット プロトコル バージョン 6 (IPv6) アドレス ファミリ。 |
|
赤外線データ アソシエーション (IrDA) アドレス ファミリ。
このアドレス ファミリは、コンピューターに赤外線ポートとドライバーがインストールされている場合にのみサポートされます。 |
|
Bluetooth アドレス ファミリ。
このアドレス ファミリは、コンピューターに Bluetooth アダプターとドライバーがインストールされている場合、SP2 以降で Windows XP でサポートされます。 |
[in] type
新しいソケットの型指定。
ソケットの種類に使用できる値は、Winsock2.h ヘッダー ファイルで定義されています。
次の表に、Windows ソケット 2 でサポートされている 型 パラメーターに使用できる値を示します。
種類 | 意味 |
---|---|
|
OOB データ転送メカニズムを使用して、シーケンスされた信頼性の高い双方向の接続ベースのバイト ストリームを提供するソケット型。 このソケットの種類は、インターネット アドレス ファミリ (AF_INET または AF_INET6) に伝送制御プロトコル (TCP) を使用します。 |
|
固定 (通常は小さい) 最大長のコネクションレスで信頼性の低いバッファーであるデータグラムをサポートするソケット型。 このソケットの種類は、インターネット アドレス ファミリ (AF_INET または AF_INET6) にユーザー データグラム プロトコル (UDP) を使用します。 |
|
アプリケーションが次の上位層プロトコル ヘッダーを操作できるようにする生のソケットを提供するソケットの種類。 IPv4 ヘッダーを操作するには、ソケットに IP_HDRINCL ソケット オプションを設定する必要があります。 IPv6 ヘッダーを操作するには、ソケットに IPV6_HDRINCL ソケット オプションを設定する必要があります。 |
|
信頼性の高いメッセージ データグラムを提供するソケットの種類。 この型の例として、Windows でのプラグマティック一般マルチキャスト (UWP) マルチキャスト プロトコルの実装が挙 、信頼性の高いマルチキャスト プログラミングと呼ばれます。
この の種類 値は、Reliable Multicast Protocol がインストールされている場合にのみサポートされます。 |
|
データグラムに基づいて擬似ストリーム パケットを提供するソケットの種類。 |
Windows ソケット 2 では、新しいソケットの種類が導入されました。 アプリケーションは、WSAEnumProtocols 関数を使用して、使用可能な各トランスポート プロトコルの属性を動的に検出できます。 そのため、アプリケーションはアドレス ファミリに使用できるソケットの種類とプロトコルのオプションを決定し、このパラメーターを指定するときにこの情報を使用できます。
Windows ソケット 1.1 では、使用可能なソケットの種類は SOCK_DGRAM と SOCK_STREAMのみです。
[in] protocol
使用するプロトコル。
プロトコル パラメーターに指定できるオプションは、指定されたアドレス ファミリとソケットの種類に固有です。
Windows Vista 以降でリリースされた Windows SDK では、ヘッダー ファイルの編成が変更され、このパラメーターには、Ws2def.h ヘッダー ファイルで定義されている IPPROTO 列挙型の値のいずれかを指定できます。
値 0 を指定した場合、呼び出し元はプロトコルを指定せず、サービス プロバイダーは使用する プロトコル を選択します。
af パラメーターがAF_INETまたはAF_INET6で、の種類 が SOCK_RAWされると、プロトコル に指定された値が IPv6 または IPv4 パケット ヘッダーのプロトコル フィールドに設定されます。
次の表は、他の多くの値が可能ですが、プロトコル の一般的な値を示しています。
[in] lpProtocolInfo
作成するソケットの特性を定義する WSAPROTOCOL_INFO 構造体へのポインター。 このパラメーターが NULL
[in] g
新しいソケットと新しいソケット グループを作成するときに実行する既存のソケット グループ ID または適切なアクション。
g が既存のソケット グループ ID である場合は、このグループによって設定されたすべての要件が満たされていれば、新しいソケットをこのソケット グループに参加させます。
g が既存のソケット グループ ID でない場合は、次の値を使用できます。
[in] dwFlags
追加のソケット属性を指定するために使用されるフラグのセット。
これらのフラグの組み合わせを設定できますが、一部の組み合わせは許可されません。
価値 | 意味 |
---|---|
|
重複する I/O 操作をサポートするソケットを作成します。
ほとんどのソケットは、このフラグを設定して作成する必要があります。 重複するソケットは、WSASend、WSASendTo、WSARecv、 重なり合った操作を許可するすべての関数 (WSASend |
|
マルチポイント セッションでc_rootになるソケットを作成します。
この属性は、ソケットを作成するトランスポート プロバイダーの WSAPROTOCOL_INFO 構造がマルチポイントまたはマルチキャスト メカニズムをサポートし、マルチポイント セッションのコントロール プレーンがルート化されている場合にのみ許可されます。 これは、XP1_SUPPORT_MULTIPOINT フラグと XP1_MULTIPOINT_CONTROL_PLANE フラグが設定された WSAPROTOCOL_INFO 構造体の dwServiceFlags1 メンバーによって示されます。
lpProtocolInfo パラメーターが NULL でない場合、トランスポート プロバイダーの WSAPROTOCOL_INFO 構造体は、lpProtocolInfo パラメーターによって指されます。 マルチポイント セッションの詳細については、「マルチポイントおよびマルチキャスト セマンティクスの」を参照してください。 |
|
マルチポイント セッションでc_leafになるソケットを作成します。
この属性は、ソケットを作成するトランスポート プロバイダーの WSAPROTOCOL_INFO 構造がマルチポイントまたはマルチキャスト メカニズムをサポートし、マルチポイント セッションのコントロール プレーンがルート化されていない場合にのみ許可されます。 これは、XP1_SUPPORT_MULTIPOINT フラグが設定され、XP1_MULTIPOINT_CONTROL_PLANE フラグが設定されていない WSAPROTOCOL_INFO 構造体の dwServiceFlags1 メンバーによって示されます。
lpProtocolInfo パラメーターが NULL でない場合、トランスポート プロバイダーの WSAPROTOCOL_INFO 構造体は、lpProtocolInfo パラメーターによって指されます。 マルチポイント セッションの詳細については、「マルチポイントおよびマルチキャスト セマンティクスの」を参照してください。 |
|
マルチポイント セッションでd_rootになるソケットを作成します。
この属性は、ソケットを作成するトランスポート プロバイダーの WSAPROTOCOL_INFO 構造がマルチポイントまたはマルチキャスト メカニズムをサポートし、マルチポイント セッションのデータ プレーンがルート化されている場合にのみ許可されます。 これは、XP1_SUPPORT_MULTIPOINT フラグと XP1_MULTIPOINT_DATA_PLANE フラグが設定された WSAPROTOCOL_INFO 構造体の dwServiceFlags1 メンバーによって示されます。
lpProtocolInfo パラメーターが NULL でない場合、トランスポート プロバイダーの WSAPROTOCOL_INFO 構造体は、lpProtocolInfo パラメーターによって指されます。 マルチポイント セッションの詳細については、「マルチポイントおよびマルチキャスト セマンティクスの」を参照してください。 |
|
マルチポイント セッションでd_leafとなるソケットを作成します。
この属性は、ソケットを作成するトランスポート プロバイダーの WSAPROTOCOL_INFO 構造がマルチポイントまたはマルチキャスト メカニズムをサポートし、マルチポイント セッションのデータ プレーンがルート化されていない場合にのみ許可されます。 これは、XP1_SUPPORT_MULTIPOINT フラグが設定され、XP1_MULTIPOINT_DATA_PLANE フラグが設定されていない WSAPROTOCOL_INFO 構造体の dwServiceFlags1 メンバーによって示されます。
lpProtocolInfo パラメーターが NULL でない場合、トランスポート プロバイダーの WSAPROTOCOL_INFO 構造体は、lpProtocolInfo パラメーターによって指されます。 マルチポイント セッションの詳細については、「マルチポイントおよびマルチキャスト セマンティクスの」を参照してください。 |
|
任意のアクセス制御リスト (DACL) ではなく、セキュリティ アクセス制御リスト (SACL) を含むソケットにセキュリティ記述子を設定できるソケットを作成します。
SACL は、オブジェクトでアクセス チェックが発生したときに監査とアラームを生成するために使用されます。 ソケットの場合、バインド 関数に指定された特定のアドレスへのバインドをソケットに許可するかどうかを判断するアクセス チェックが行われます。 ACCESS_SYSTEM_SECURITY アクセス権は、オブジェクトのセキュリティ記述子で SACL を取得または設定する機能を制御します。 システムは、要求するスレッドのアクセス トークンで SE_SECURITY_NAME 特権が有効になっている場合にのみ、このアクセス権を付与します。 |
|
継承できないソケットを作成します。
WSASocket または ソケット 関数によって作成されたソケット ハンドルは、既定で継承できます。 このフラグが設定されている場合、ソケット ハンドルは継承できません。 GetHandleInformation 関数を使用して、WSA_FLAG_NO_HANDLE_INHERIT フラグを設定してソケット ハンドルが作成されたかどうかを判断できます。 GetHandleInformation 関数は、HANDLE_FLAG_INHERIT 値が設定されていることを返します。 このフラグは、Windows 7 SP1、Windows Server 2008 R2 SP1 以降でサポートされています |
戻り値
エラーが発生しない場合、WSASocket
エラー コード | 意味 |
---|---|
|
WSAStartup 呼び出し |
|
ネットワーク サブシステムが失敗しました。 |
|
指定されたアドレス ファミリはサポートされていません。 |
|
lpProtocolInfo パラメーターが、プロセス・アドレス・スペースの有効な部分にありません。 |
|
ブロックしている Windows ソケット 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。 |
|
この値は、次のいずれかの条件に当てはまります。
|
|
サービス プロバイダーから 2.2 以外のバージョンが返されました。 |
|
サービス プロバイダーは、WSPStartupに無効または不完全なプロシージャ テーブルを返しました。 |
|
これ以上ソケット記述子を使用できません。 |
|
使用できるバッファー領域はありません。 ソケットを作成できません。 |
|
指定されたプロトコルはサポートされていません。 |
|
指定されたプロトコルがこのソケットに対して正しくない型です。 |
|
サービス プロバイダーの初期化に失敗しました。 このエラーは、階層化サービス プロバイダー (LSP) または名前空間プロバイダーが正しくインストールされていない場合、またはプロバイダーが正しく動作しなかった場合に返されます。 |
|
指定されたソケットの種類は、このアドレス ファミリではサポートされていません。 |
備考
WSASocket 関数
WSASocket 関数を使用してソケットを作成する場合、dwFlags パラメーターには、SO_RCVTIMEO または SO_SNDTIMEO ソケット オプションに対して WSA_FLAG_OVERLAPPED 属性が設定されている必要があります。 それ以外の場合、タイムアウトはソケットに反映されません。
SOCK_STREAM などの接続指向ソケットは、全二重接続を提供し、データを送受信する前に接続状態である必要があります。 指定したソケットへの接続は、
信頼性の高い接続指向ソケットを実装するために使用される通信プロトコルにより、データが失われたり重複したりしないようにします。 ピア プロトコルにバッファー領域があるデータを適切な時間内に正常に送信できない場合、接続は切断されたと見なされ、以降の呼び出しは WSAETIMEDOUT
コネクションレスのメッセージ指向ソケットを使用すると、WSARecvFromから WSASendTo および
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 特権を削除します。これは不要になったためです。
ソケット グループ
WinSock 2 では、ソケット グループの概念がアプリケーションの手段として導入されました。つまり、アプリケーションのセットが連携して、基になるサービス プロバイダーに対して、ソケットの特定のセットが関連していること、およびこのように形成されたグループに特定の属性があることを示しています。 グループ属性には、グループ内の個々のソケットの相対的な優先順位と、グループのサービス品質の仕様が含まれます。ネットワーク経由でマルチメディア ストリームを交換する必要があるアプリケーションは、ソケットのセット間で特定の関係を確立できる場合に役立つ可能性がある例です。 ソケット グループの処理方法はトランスポートに依存します。
WSAAccept 関数
ソケット グループの相対グループ優先順位には、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 ストア アプリでサポートされています。
手記
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 |
関連項目
を受け入れる
closesocket を閉じる
ioctlsocket を
recv を
から recv を
を選択
を送信
sendto を
シャットダウン の
ソケット