socket 関数 (winsock2.h)
socket 関数は、特定のトランスポート サービス プロバイダーにバインドされたソケットを作成します。
構文
SOCKET WSAAPI socket(
[in] int af,
[in] int type,
[in] int protocol
);
パラメーター
[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_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 でサポートされている 型 パラメーターに使用できる値を示します。
Type | 説明 |
---|---|
|
OOB データ転送メカニズムを使用して、シーケンス化された信頼性の高い双方向の接続ベースのバイト ストリームを提供するソケット型。 このソケットの種類では、インターネット アドレス ファミリ (AF_INET または AF_INET6) に伝送制御プロトコル (TCP) が使用されます。 |
|
固定 (通常は小さい) 最大長のコネクションレスで信頼性の低いバッファーであるデータグラムをサポートするソケット型。 このソケットの種類では、インターネット アドレス ファミリ (AF_INETまたはAF_INET6) にユーザー データグラム プロトコル (UDP) が使用されます。 |
|
アプリケーションが次の上位層プロトコル ヘッダーを操作できるようにする生のソケットを提供するソケットの種類。 IPv4 ヘッダーを操作するには、 ソケットで IP_HDRINCL ソケット オプションを設定する必要があります。 IPv6 ヘッダーを操作するには、 ソケットで IPV6_HDRINCL ソケット オプションを設定する必要があります。 |
|
信頼性の高いメッセージ データグラムを提供するソケットの種類。 この種類の例として、Windows でのプラグマティック一般マルチキャスト (PGM) マルチキャスト プロトコルの実装があります。これは、多くの場合、 信頼性の高いマルチキャスト プログラミングと呼ばれます。
この 型 の値は、Reliable Multicast Protocol がインストールされている場合にのみサポートされます。 |
|
データグラムに基づいて擬似ストリーム パケットを提供するソケットの種類。 |
Windows ソケット 2 では、新しいソケットの種類が導入されました。 アプリケーションは、 WSAEnumProtocols 関数を使用して、使用可能な各トランスポート プロトコルの属性を動的に検出できます。 そのため、アプリケーションはアドレス ファミリに使用可能なソケットの種類とプロトコル オプションを決定し、このパラメーターを指定するときにこの情報を使用できます。 Winsock2.h および Ws2def.h ヘッダー ファイルのソケットの種類の定義は、新しいソケットの種類、アドレス ファミリ、およびプロトコルが定義されると、定期的に更新されます。
Windows Sockets 1.1 では、使用可能なソケットの種類は SOCK_DGRAM と SOCK_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 パケット・ヘッダーのプロトコル・フィールドに設定されます。
プロトコルの一般的な 値を次 の表に示しますが、他の多くの値を使用できます。
戻り値
エラーが発生しない場合、 ソケット は新しいソケットを参照する記述子を返します。 それ以外の場合は、INVALID_SOCKETの値が返され、 WSAGetLastError を呼び出すことによって特定のエラー コードを取得できます。
エラー コード | 意味 |
---|---|
この関数を使用する前に 、WSAStartup 呼び出しが正常に行われる必要があります。 | |
ネットワーク サブシステムまたは関連付けられているサービス プロバイダーが失敗しました。 | |
指定されたアドレス ファミリはサポートされていません。 たとえば、アプリケーションが AF_IRDA アドレス ファミリのソケットを作成しようとしましたが、赤外線アダプターとデバイス ドライバーがローカル コンピューターにインストールされていません。 | |
ブロックしている Windows ソケット 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。 | |
これ以上使用できるソケット記述子がありません。 | |
無効な引数が指定されました。 af パラメーターが AF_UNSPEC に設定され、型とプロトコル パラメーターが指定されていない場合、このエラーが返されます。 | |
サービス プロバイダーから 2.2 以外のバージョンが返されました。 | |
サービス プロバイダーから WSPStartup に無効なプロシージャ テーブルまたは不完全なプロシージャ テーブルが返されました。 | |
バッファーに空き領域がありません。 ソケットを作成できません。 | |
指定されたプロトコルはサポートされません。 | |
指定されたプロトコルがこのソケットに対して正しくない型です。 | |
サービス プロバイダーの初期化に失敗しました。 このエラーは、階層型サービス プロバイダー (LSP) または名前空間プロバイダーが正しくインストールされていない場合、またはプロバイダーが正しく動作しなかった場合に返されます。 | |
指定されたソケットの種類は、このアドレス ファミリではサポートされていません。 |
注釈
ソケット関数により、ソケット記述子と関連リソースが割り当てられ、特定のトランスポート サービス プロバイダーにバインドされます。 Winsock は、アドレス ファミリ、ソケットの種類、プロトコル パラメーターの要求された組み合わせをサポートする最初の利用可能なサービス プロバイダーを利用します。 作成されるソケットには、重複する属性が既定として含まれます。 Windows の場合、Mswsock.h で定義されている Microsoft 固有のソケット オプション SO_OPENTYPEは、この既定値に影響する可能性があります。 SO_OPENTYPEの詳細については、Microsoft 固有のドキュメントを参照してください。
重複する属性のないソケットは、 WSASocket を使用して作成できます。 重複する操作 (WSASend、 WSARecv、 WSASendTo、 WSARecvFrom、および WSAIoctl) を許可するすべての関数は、重複する操作に関連するパラメーターの値が NULL の場合、重複するソケットでのオーバーラップされていない使用もサポートします。
プロトコルとそのサポート サービス プロバイダーを選択する場合、この手順では、プロトコルレイヤー自体ではなく、基本プロトコルまたはプロトコル チェーンのみを選択します。 非チェーン プロトコル レイヤーは、 型 または af に部分的な一致があるとは見なされません。 つまり、適切なプロトコルが見つからない場合、 WSAEAFNOSUPPORT または WSAEPROTONOSUPPORT のエラー コードは発生しません。
SOCK_STREAMなどの接続指向ソケットは、全二重接続を提供し、データを送受信する前に接続状態である必要があります。 接続呼び出しを使用して、別のソケットへの 接続 が作成されます。 接続されると、 送信 呼び出しと recv 呼び出しを使用してデータを転送できます。 セッションが完了したら、 closesocket を実行する必要があります。
信頼性の高い接続指向ソケットを実装するために使用される通信プロトコルにより、データが失われたり重複したりすることがないようにします。 ピア プロトコルにバッファー領域があるデータを適切な時間内に正常に送信できない場合、接続は切断されたと見なされ、その後の呼び出しは WSAETIMEDOUT に設定されたエラー コードで失敗します。
コネクションレスのメッセージ指向ソケットを使用すると、 sendto と recvfrom を使用して任意のピアとの間でデータグラムを送受信できます。 このようなソケットが特定のピアに接続されている場合、データグラムは send を使用してそのピアに送信でき、 recv を使用してこのピアからのみ受信できます。
IPv6 と IPv4 は、SOCK_RAWの種類のソケットを受信するときに動作が異なります。 IPv4 受信パケットには、パケット ペイロード、次の上位レベルヘッダー (TCP または UDP パケットの IP ヘッダーなど)、IPv4 パケット ヘッダーが含まれます。 IPv6 受信パケットには、パケット ペイロードと次の上位レベルヘッダーが含まれます。 IPv6 受信パケットに IPv6 パケット ヘッダーが含まれることはありません。
tcp/IP 経由の NetBIOS に af パラメーターが AF_NETBIOS されている場合、 型 パラメーターは SOCK_DGRAM または SOCK_SEQPACKETできます。 AF_NETBIOS アドレス ファミリの場合、プロトコル パラメーターは負の数として表される LAN アダプター番号です。
Windows XP 以降では、次のコマンドを使用して Windows ソケット カタログを一覧表示し、インストールされているサービス プロバイダーと、サポートされているアドレス ファミリ、ソケットの種類、プロトコルを確認できます。
netsh winsock show catalog
型 SOCK_RAW を持つソケットのサポートは必要ありませんが、サービス プロバイダーは、実行可能な生のソケットをサポートすることをお勧めします。
IrDA ソケットに関する注意事項
次の点に注意してください。- Af_irda.h ヘッダー ファイルは明示的に含まれている必要があります。
- SOCK_STREAMのみがサポートされています。SOCK_DGRAMの種類は IrDA ではサポートされていません。
- IrDA の場合、プロトコル パラメーターは常に 0 に設定されます。
コード例
次の例では、 ソケット 関数を使用して、特定のトランスポート サービス プロバイダーにバインドされたソケットを作成する方法を示します。#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;
// Validate the parameters
if (argc != 4) {
wprintf(L"usage: %s <addressfamily> <type> <protocol>\n", argv[0]);
wprintf(L"socket opens a socket for the specified family, type, & protocol\n");
wprintf(L"%ws example usage\n", argv[0]);
wprintf(L" %ws 0 2 17\n", argv[0]);
wprintf(L" where AF_UNSPEC=0 SOCK_DGRAM=2 IPPROTO_UDP=17\n", argv[0]);
return 1;
}
iFamily = _wtoi(argv[1]);
iType = _wtoi(argv[2]);
iProtocol = _wtoi(argv[3]);
// 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);
sock = socket(iFamily, iType, iProtocol);
if (sock == INVALID_SOCKET)
wprintf(L"socket function failed with error = %d\n", WSAGetLastError() );
else {
wprintf(L"socket 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 failed with error = %d\n", WSAGetLastError() );
WSACleanup();
return 1;
}
}
WSACleanup();
return 0;
}
Windows Phone 8: この関数は、Windows Phone 8 以降の Windows Phone ストア アプリでサポートされています。
Windows 8.1とWindows Server 2012 R2: この関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストア アプリでサポートされています。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 8.1、Windows Vista [デスクトップ アプリ |UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | winsock2.h |
Library | Ws2_32.lib |
[DLL] | Ws2_32.dll |