socket 関数 (winsock2.h)

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

構文

SOCKET WSAAPI socket(
  [in] int af,
  [in] int type,
  [in] int protocol
);

パラメーター

[in] af

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

Windows Vista 以降でリリースされた Windows SDK では、ヘッダー ファイルの編成が変更され、アドレス ファミリの使用可能な値は Ws2def.h ヘッダー ファイルで定義されています。 Ws2def.h ヘッダー ファイルは Winsock2.h に自動的に含まれるので、直接使用しないでください。

現在サポートされている値は、IPv4 および IPv6 のインターネット アドレス ファミリ形式であるAF_INETまたはAF_INET6です。 アドレス ファミリのその他のオプション (たとえば、NetBIOS で使用するAF_NETBIOS) は、アドレス ファミリの Windows Sockets サービス プロバイダーがインストールされている場合にサポートされます。 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 Sockets 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 でのプラグマティック 一般マルチキャスト (UWP) マルチキャスト プロトコルの実装があります。

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

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

戻り値

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

エラー コード 意味
WSANOTINITIALISED
この関数を使用する前に 、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 を使用して作成できます。 重複操作 (WSASendWSARecvWSASendToWSARecvFromWSAIoctl) を許可するすべての関数は、重複する操作に関連するパラメーターの値が 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.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

こちらもご覧ください

IPPROTO_IP ソケット オプション

IPPROTO_IPV6 ソケット オプション

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

WSASocket

Winsock 関数

Winsock リファレンス

accept

bind

closesocket

connect

getsockname

getsockopt

ioctlsocket

listen

Recv

recvfrom

select

送信

Sendto

setsockopt

shutdown