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_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 がインストールされている場合にのみサポートされます。

戻り値

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

エラー コード 意味
WSANOTINITIALIZED
この関数を使用する前に 、WSAStartup 呼び出しが正常に行われる必要があります。
WSAENETDOWN
ネットワーク サブシステムまたは関連付けられているサービス プロバイダーが失敗しました。
WSAEAFNOSUPPORT
指定されたアドレス ファミリはサポートされていません。 たとえば、アプリケーションが AF_IRDA アドレス ファミリのソケットを作成しようとしましたが、赤外線アダプターとデバイス ドライバーがローカル コンピューターにインストールされていません。
WSAEINPROGRESS
ブロックしている Windows ソケット 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。
WSAEMFILE
これ以上使用できるソケット記述子がありません。
WSAEINVAL
無効な引数が指定されました。 af パラメーターが AF_UNSPEC に設定され、プロトコル パラメーターが指定されていない場合、このエラーが返されます。
WSAEINVALIDPROVIDER
サービス プロバイダーから 2.2 以外のバージョンが返されました。
WSAEINVALIDPROCTABLE
サービス プロバイダーから WSPStartup に無効なプロシージャ テーブルまたは不完全なプロシージャ テーブルが返されました。
WSAENOBUFS
バッファーに空き領域がありません。 ソケットを作成できません。
WSAEPROTONOSUPPORT
指定されたプロトコルはサポートされません。
WSAEPROTOTYPE
指定されたプロトコルがこのソケットに対して正しくない型です。
WSAEPROVIDERFAILEDINIT
サービス プロバイダーの初期化に失敗しました。 このエラーは、階層型サービス プロバイダー (LSP) または名前空間プロバイダーが正しくインストールされていない場合、またはプロバイダーが正しく動作しなかった場合に返されます。
WSAESOCKTNOSUPPORT
指定されたソケットの種類は、このアドレス ファミリではサポートされていません。

注釈

ソケット関数により、ソケット記述子と関連リソースが割り当てられ、特定のトランスポート サービス プロバイダーにバインドされます。 Winsock は、アドレス ファミリ、ソケットの種類、プロトコル パラメーターの要求された組み合わせをサポートする最初の利用可能なサービス プロバイダーを利用します。 作成されるソケットには、重複する属性が既定として含まれます。 Windows の場合、Mswsock.h で定義されている Microsoft 固有のソケット オプション SO_OPENTYPEは、この既定値に影響する可能性があります。 SO_OPENTYPEの詳細については、Microsoft 固有のドキュメントを参照してください。

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

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

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

SOCK_STREAMなどの接続指向ソケットは、全二重接続を提供し、データを送受信する前に接続状態である必要があります。 接続呼び出しを使用して、別のソケットへの 接続 が作成されます。 接続されると、 送信 呼び出しと recv 呼び出しを使用してデータを転送できます。 セッションが完了したら、 closesocket を実行する必要があります。

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

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

IPv6 と IPv4 は、SOCK_RAWの種類のソケットを受信するときに動作が異なります。 IPv4 受信パケットには、パケット ペイロード、次の上位レベルヘッダー (TCP または UDP パケットの IP ヘッダーなど)、IPv4 パケット ヘッダーが含まれます。 IPv6 受信パケットには、パケット ペイロードと次の上位レベルヘッダーが含まれます。 IPv6 受信パケットに IPv6 パケット ヘッダーが含まれることはありません。

メモWindows NTでは、生ソケットのサポートには管理特権が必要です。
 
SOCK_SEQPACKETの型パラメーターを持つソケットはデータグラムに基づいていますが、擬似ストリーム プロトコルとして機能します。 送受信パケットの両方に対して、個別のデータグラムが使用されます。 ただし、Windows ソケットでは、複数の受信パケットを 1 つのパケットに結合できます。 そのため、アプリケーションは受信呼び出し ( recvWSARecvEx など) を発行し、1 回の呼び出しで複数の結合された複数のパケットからデータを取得できます。 AF_NETBIOS アドレス ファミリは、 SOCK_SEQPACKETの型 パラメーター サポートしています。

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 に設定されます。
AF_IRDA アドレス ファミリで使用するソケットは、ローカル コンピューターに赤外線ポートとドライバーがインストールされている場合にのみ作成できます。 それ以外の場合、af パラメーターを AF_IRDA に設定したソケット関数の呼び出しは失敗し、WSAGetLastError はWSAEPROTONOSUPPORT を返します。

コード例

次の例では、 ソケット 関数を使用して、特定のトランスポート サービス プロバイダーにバインドされたソケットを作成する方法を示します。
#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.1Windows 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

こちらもご覧ください

IPPROTO_IP ソケット オプション

IPPROTO_IPV6 ソケット オプション

信頼性の高いマルチキャスト プログラミング

WSASocket

Winsock 関数

Winsock リファレンス

accept

bind

closesocket

connect

getsockname

getsockopt

ioctlsocket

listen

Recv

recvfrom

select

送信

Sendto

setsockopt

shutdown