Win32 API 日本語リファレンス
ホームNetworking.WinSock › socket

socket

関数
指定したアドレスファミリ・型・プロトコルのソケットを作成する。
DLLWS2_32.dll呼出規約winapiSetLastErrorあり対応OSWindows 8.1 以降

シグネチャ

// WS2_32.dll
#include <windows.h>

SOCKET socket(
    INT af,
    WINSOCK_SOCKET_TYPE type,
    INT protocol
);

パラメーター

名前方向説明
afINTin

アドレスファミリの指定です。アドレスファミリに指定可能な値は Winsock2.h ヘッダーファイルで定義されています。

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

現在サポートされている値は AF_INET または AF_INET6 で、これらはそれぞれ IPv4 および IPv6 のインターネット アドレスファミリ形式です。アドレスファミリのその他のオプション(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 Compatible Transport プロトコルがインストールされている場合にのみサポートされます。

このアドレスファミリは Windows Vista 以降ではサポートされません。

AF_APPLETALK
16
AppleTalk アドレスファミリです。このアドレスファミリは、AppleTalk プロトコルがインストールされている場合にのみサポートされます。

このアドレスファミリは Windows Vista 以降ではサポートされません。

AF_NETBIOS
17
NetBIOS アドレスファミリです。このアドレスファミリは、NetBIOS 用の Windows Sockets プロバイダーがインストールされている場合にのみサポートされます。

NetBIOS 用の Windows Sockets プロバイダーは 32 ビット版の Windows でサポートされます。このプロバイダーは 32 ビット版の Windows に既定でインストールされます。

NetBIOS 用の Windows Sockets プロバイダーは、Windows 7、Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP を含む 64 ビット版の Windows ではサポートされません。

NetBIOS 用の Windows Sockets プロバイダーは、type パラメーターが SOCK_DGRAM に設定されたソケットのみをサポートします。

NetBIOS 用の Windows Sockets プロバイダーは、NetBIOS プログラミングインターフェイスと直接関係するものではありません。NetBIOS プログラミングインターフェイスは Windows Vista、Windows Server 2008 以降ではサポートされません。

AF_INET6
23
インターネットプロトコルバージョン 6 (IPv6) のアドレスファミリです。
AF_IRDA
26
Infrared Data Association (IrDA) アドレスファミリです。

このアドレスファミリは、コンピューターに赤外線ポートとドライバーがインストールされている場合にのみサポートされます。

AF_BTH
32
Bluetooth アドレスファミリです。

このアドレスファミリは、コンピューターに Bluetooth アダプターとドライバーがインストールされている場合、Windows XP with SP2 以降でサポートされます。

typeWINSOCK_SOCKET_TYPEin

新しいソケットの種類の指定です。

ソケットの種類に指定可能な値は Winsock2.h ヘッダーファイルで定義されています。

以下の表は、Windows Sockets 2 でサポートされる type パラメーターに指定可能な値を示しています。

Type 意味
SOCK_STREAM
1
OOB データ伝送機構を備えた、順序付けされた信頼性のある双方向のコネクション型バイトストリームを提供するソケットの種類です。このソケットの種類は、インターネットアドレスファミリ (AF_INET または AF_INET6) に対して Transmission Control Protocol (TCP) を使用します。
SOCK_DGRAM
2
データグラムをサポートするソケットの種類です。データグラムはコネクションレスで信頼性のない、固定の(通常は小さい)最大長を持つバッファーです。このソケットの種類は、インターネットアドレスファミリ (AF_INET または AF_INET6) に対して User Datagram Protocol (UDP) を使用します。
SOCK_RAW
3
アプリケーションが次の上位層プロトコルのヘッダーを操作できる raw ソケットを提供するソケットの種類です。IPv4 ヘッダーを操作するには、ソケットに IP_HDRINCL ソケットオプションを設定する必要があります。IPv6 ヘッダーを操作するには、ソケットに IPV6_HDRINCL ソケットオプションを設定する必要があります。
SOCK_RDM
4
信頼性のあるメッセージデータグラムを提供するソケットの種類です。この種類の例として、Windows における Pragmatic General Multicast (PGM) マルチキャストプロトコルの実装があり、しばしば信頼性のあるマルチキャストプログラミングと呼ばれます。

この type の値は、Reliable Multicast Protocol がインストールされている場合にのみサポートされます。

SOCK_SEQPACKET
5
データグラムに基づく疑似ストリームパケットを提供するソケットの種類です。

Windows Sockets 2 では、新しいソケットの種類が導入されました。アプリケーションは WSAEnumProtocols 関数を通じて、利用可能な各トランスポートプロトコルの属性を動的に検出できます。したがって、アプリケーションはあるアドレスファミリに対して指定可能なソケットの種類とプロトコルのオプションを判別し、このパラメーターを指定する際にこの情報を利用できます。Winsock2.h および Ws2def.h ヘッダーファイル内のソケットの種類の定義は、新しいソケットの種類、アドレスファミリ、プロトコルが定義されるたびに定期的に更新されます。

Windows Sockets 1.1 では、指定可能なソケットの種類は SOCK_DGRAMSOCK_STREAM のみです。

protocolINTin

使用するプロトコルです。protocol パラメーターに指定可能なオプションは、指定されたアドレスファミリおよびソケットの種類に固有です。protocol に指定可能な値は Winsock2.h および Wsrm.h ヘッダーファイルで定義されています。

Windows Vista 以降向けにリリースされた Windows SDK では、ヘッダーファイルの構成が変更され、このパラメーターには Ws2def.h ヘッダーファイルで定義されている IPPROTO 列挙型の値のいずれかを指定できます。なお、Ws2def.h ヘッダーファイルは Winsock2.h から自動的にインクルードされるため、直接使用しないでください。

値に 0 を指定した場合、呼び出し元はプロトコルを指定しないことになり、サービスプロバイダーが使用する protocol を選択します。

af パラメーターが AF_INET または AF_INET6 で、typeSOCK_RAW の場合、protocol に指定された値が IPv6 または IPv4 パケットヘッダーのプロトコルフィールドに設定されます。

以下の表は protocol の代表的な値を示していますが、他にも多くの値が指定可能です。

protocol 意味
IPPROTO_ICMP
1
Internet Control Message Protocol (ICMP) です。これは、af パラメーターが AF_UNSPECAF_INET、または AF_INET6 で、type パラメーターが SOCK_RAW または未指定の場合に指定可能な値です。

この protocol の値は Windows XP 以降でサポートされます。

IPPROTO_IGMP
2
Internet Group Management Protocol (IGMP) です。これは、af パラメーターが AF_UNSPECAF_INET、または AF_INET6 で、type パラメーターが SOCK_RAW または未指定の場合に指定可能な値です。

この protocol の値は Windows XP 以降でサポートされます。

BTHPROTO_RFCOMM
3
Bluetooth Radio Frequency Communications (Bluetooth RFCOMM) プロトコルです。これは、af パラメーターが AF_BTH で、type パラメーターが SOCK_STREAM の場合に指定可能な値です。

この protocol の値は Windows XP with SP2 以降でサポートされます。

IPPROTO_TCP
6
Transmission Control Protocol (TCP) です。これは、af パラメーターが AF_INET または AF_INET6 で、type パラメーターが SOCK_STREAM の場合に指定可能な値です。
IPPROTO_UDP
17
User Datagram Protocol (UDP) です。これは、af パラメーターが AF_INET または AF_INET6 で、type パラメーターが SOCK_DGRAM の場合に指定可能な値です。
IPPROTO_ICMPV6
58
Internet Control Message Protocol Version 6 (ICMPv6) です。これは、af パラメーターが AF_UNSPECAF_INET、または AF_INET6 で、type パラメーターが SOCK_RAW または未指定の場合に指定可能な値です。

この protocol の値は Windows XP 以降でサポートされます。

IPPROTO_RM
113
信頼性のあるマルチキャスト用の PGM プロトコルです。これは、af パラメーターが AF_INET で、type パラメーターが SOCK_RDM の場合に指定可能な値です。Windows Vista 以降向けにリリースされた Windows SDK では、このプロトコルは IPPROTO_PGM とも呼ばれます。

この protocol の値は、Reliable Multicast Protocol がインストールされている場合にのみサポートされます。

戻り値の型: SOCKET

公式ドキュメント

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

戻り値

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

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

解説(Remarks)

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

オーバーラップ属性を持たないソケットは、 WSASocket を使用して作成できます。オーバーラップ操作を可能にするすべての関数(WSASendWSARecvWSASendToWSARecvFromWSAIoctl)も、オーバーラップ操作に関連するパラメーターの値が NULL であれば、オーバーラップソケット上での非オーバーラップ使用をサポートします。

プロトコルとそれをサポートするサービスプロバイダーを選択する際、この手続きはベースプロトコルまたはプロトコルチェーンのみを選択し、プロトコルレイヤー単体は選択しません。チェーン化されていないプロトコルレイヤーは、typeaf の部分的な一致を持つとは見なされません。すなわち、適切なプロトコルが見つからない場合でも、 WSAEAFNOSUPPORTWSAEPROTONOSUPPORT のエラーコードを引き起こすことはありません。

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

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

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

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

typeSOCK_RAW のソケットを受信する際、IPv6 と IPv4 では動作が異なります。IPv4 の受信パケットには、パケットのペイロード、次の上位層ヘッダー(たとえば TCP または UDP パケットの IP ヘッダー)、および IPv4 パケットヘッダーが含まれます。IPv6 の受信パケットには、パケットのペイロードと次の上位層ヘッダーが含まれます。IPv6 の受信パケットには IPv6 パケットヘッダーは含まれません。

注意 Windows NT では、raw ソケットのサポートには管理者権限が必要です。
type パラメーターが SOCK_SEQPACKET のソケットはデータグラムに基づきますが、疑似ストリームプロトコルとして機能します。送信パケットと受信パケットの両方で、個別のデータグラムが使用されます。ただし、Windows Sockets は複数の受信パケットを 1 つのパケットに結合することがあります。そのため、アプリケーションは 1 回の受信呼び出し(たとえば recvWSARecvEx)で、結合された複数のパケットからデータを取得できます。AF_NETBIOS アドレスファミリは、type パラメーターの SOCK_SEQPACKET をサポートします。

af パラメーターが NetBIOS over TCP/IP 用の AF_NETBIOS の場合、type パラメーターには SOCK_DGRAM または SOCK_SEQPACKET を指定できます。AF_NETBIOS アドレスファミリの場合、protocol パラメーターは負の数で表現された LAN アダプター番号です。

Windows XP 以降では、次のコマンドを使用して Windows Sockets カタログを一覧表示し、インストールされているサービスプロバイダーと、サポートされているアドレスファミリ、ソケットの種類、プロトコルを確認できます。

netsh winsock show catalog

SOCK_RAW の種類のソケットのサポートは必須ではありませんが、サービスプロバイダーは可能な限り raw ソケットをサポートすることが推奨されます。

IrDA ソケットに関する注意

次の点に注意してください。 AF_IRDA アドレスファミリで使用するソケットは、ローカルコンピューターに赤外線ポートとドライバーがインストールされている場合にのみ作成できます。そうでない場合、af パラメーターを AF_IRDA に設定した socket 関数の呼び出しは失敗し、WSAGetLastErrorWSAEPROTONOSUPPORT を返します。

サンプルコード

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

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

// WS2_32.dll
#include <windows.h>

SOCKET socket(
    INT af,
    WINSOCK_SOCKET_TYPE type,
    INT protocol
);
[DllImport("WS2_32.dll", SetLastError = true, ExactSpelling = true)]
static extern UIntPtr socket(
    int af,   // INT
    int type,   // WINSOCK_SOCKET_TYPE
    int protocol   // INT
);
<DllImport("WS2_32.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function socket(
    af As Integer,   ' INT
    type As Integer,   ' WINSOCK_SOCKET_TYPE
    protocol As Integer   ' INT
) As UIntPtr
End Function
' af : INT
' type : WINSOCK_SOCKET_TYPE
' protocol : INT
Declare PtrSafe Function socket Lib "ws2_32" ( _
    ByVal af As Long, _
    ByVal type As Long, _
    ByVal protocol As Long) As LongPtr
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

socket = ctypes.windll.ws2_32.socket
socket.restype = ctypes.c_size_t
socket.argtypes = [
    ctypes.c_int,  # af : INT
    ctypes.c_int,  # type : WINSOCK_SOCKET_TYPE
    ctypes.c_int,  # protocol : INT
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('WS2_32.dll')
socket = Fiddle::Function.new(
  lib['socket'],
  [
    Fiddle::TYPE_INT,  # af : INT
    Fiddle::TYPE_INT,  # type : WINSOCK_SOCKET_TYPE
    Fiddle::TYPE_INT,  # protocol : INT
  ],
  Fiddle::TYPE_UINTPTR_T)
#[link(name = "ws2_32")]
extern "system" {
    fn socket(
        af: i32,  // INT
        type: i32,  // WINSOCK_SOCKET_TYPE
        protocol: i32  // INT
    ) -> usize;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("WS2_32.dll", SetLastError = true)]
public static extern UIntPtr socket(int af, int type, int protocol);
"@
$api = Add-Type -MemberDefinition $sig -Name 'WS2_32_socket' -Namespace Win32 -PassThru
# $api::socket(af, type, protocol)
#uselib "WS2_32.dll"
#func global socket "socket" sptr, sptr, sptr
; socket af, type, protocol   ; 戻り値は stat
; af : INT -> "sptr"
; type : WINSOCK_SOCKET_TYPE -> "sptr"
; protocol : INT -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "WS2_32.dll"
#cfunc global socket "socket" int, int, int
; res = socket(af, type, protocol)
; af : INT -> "int"
; type : WINSOCK_SOCKET_TYPE -> "int"
; protocol : INT -> "int"
; SOCKET socket(INT af, WINSOCK_SOCKET_TYPE type, INT protocol)
#uselib "WS2_32.dll"
#cfunc global socket "socket" int, int, int
; res = socket(af, type, protocol)
; af : INT -> "int"
; type : WINSOCK_SOCKET_TYPE -> "int"
; protocol : INT -> "int"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	ws2_32 = windows.NewLazySystemDLL("WS2_32.dll")
	procsocket = ws2_32.NewProc("socket")
)

// af (INT), type (WINSOCK_SOCKET_TYPE), protocol (INT)
r1, _, err := procsocket.Call(
	uintptr(af),
	uintptr(type),
	uintptr(protocol),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // SOCKET
function socket(
  af: Integer;   // INT
  type: Integer;   // WINSOCK_SOCKET_TYPE
  protocol: Integer   // INT
): NativeUInt; stdcall;
  external 'WS2_32.dll' name 'socket';
result := DllCall("WS2_32\socket"
    , "Int", af   ; INT
    , "Int", type   ; WINSOCK_SOCKET_TYPE
    , "Int", protocol   ; INT
    , "UPtr")   ; return: SOCKET
●socket(af, type, protocol) = DLL("WS2_32.dll", "int socket(int, int, int)")
# 呼び出し: socket(af, type, protocol)
# af : INT -> "int"
# type : WINSOCK_SOCKET_TYPE -> "int"
# protocol : INT -> "int"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "ws2_32" fn socket(
    af: i32, // INT
    type: i32, // WINSOCK_SOCKET_TYPE
    protocol: i32 // INT
) callconv(std.os.windows.WINAPI) usize;
proc socket(
    af: int32,  # INT
    `type`: int32,  # WINSOCK_SOCKET_TYPE
    protocol: int32  # INT
): uint {.importc: "socket", stdcall, dynlib: "WS2_32.dll".}
pragma(lib, "ws2_32");
extern(Windows)
size_t socket(
    int af,   // INT
    int type,   // WINSOCK_SOCKET_TYPE
    int protocol   // INT
);
ccall((:socket, "WS2_32.dll"), stdcall, Csize_t,
      (Int32, Int32, Int32),
      af, type, protocol)
# af : INT -> Int32
# type : WINSOCK_SOCKET_TYPE -> Int32
# protocol : INT -> Int32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
uintptr_t socket(
    int32_t af,
    int32_t type,
    int32_t protocol);
]]
local ws2_32 = ffi.load("ws2_32")
-- ws2_32.socket(af, type, protocol)
-- af : INT
-- type : WINSOCK_SOCKET_TYPE
-- protocol : INT
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('WS2_32.dll');
const socket = lib.func('__stdcall', 'socket', 'uintptr_t', ['int32_t', 'int32_t', 'int32_t']);
// socket(af, type, protocol)
// af : INT -> 'int32_t'
// type : WINSOCK_SOCKET_TYPE -> 'int32_t'
// protocol : INT -> 'int32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("WS2_32.dll", {
  socket: { parameters: ["i32", "i32", "i32"], result: "usize" },
});
// lib.symbols.socket(af, type, protocol)
// af : INT -> "i32"
// type : WINSOCK_SOCKET_TYPE -> "i32"
// protocol : INT -> "i32"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
size_t socket(
    int32_t af,
    int32_t type,
    int32_t protocol);
C, "WS2_32.dll");
// $ffi->socket(af, type, protocol);
// af : INT
// type : WINSOCK_SOCKET_TYPE
// protocol : INT
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Ws2_32 extends StdCallLibrary {
    Ws2_32 INSTANCE = Native.load("ws2_32", Ws2_32.class);
    long socket(
        int af,   // INT
        int type,   // WINSOCK_SOCKET_TYPE
        int protocol   // INT
    );
}
@[Link("ws2_32")]
lib LibWS2_32
  fun socket = socket(
    af : Int32,   # INT
    type_ : Int32,   # WINSOCK_SOCKET_TYPE
    protocol : Int32   # INT
  ) : LibC::SizeT
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef socketNative = UintPtr Function(Int32, Int32, Int32);
typedef socketDart = int Function(int, int, int);
final socket = DynamicLibrary.open('WS2_32.dll')
    .lookupFunction<socketNative, socketDart>('socket');
// af : INT -> Int32
// type : WINSOCK_SOCKET_TYPE -> Int32
// protocol : INT -> Int32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function socket(
  af: Integer;   // INT
  type: Integer;   // WINSOCK_SOCKET_TYPE
  protocol: Integer   // INT
): NativeUInt; stdcall;
  external 'WS2_32.dll' name 'socket';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "socket"
  c_socket :: Int32 -> Int32 -> Int32 -> IO CUIntPtr
-- af : INT -> Int32
-- type : WINSOCK_SOCKET_TYPE -> Int32
-- protocol : INT -> Int32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let socket =
  foreign "socket"
    (int32_t @-> int32_t @-> int32_t @-> returning size_t)
(* af : INT -> int32_t *)
(* type : WINSOCK_SOCKET_TYPE -> int32_t *)
(* protocol : INT -> int32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library ws2_32 (t "WS2_32.dll"))
(cffi:use-foreign-library ws2_32)

(cffi:defcfun ("socket" socket :convention :stdcall) :uint64
  (af :int32)   ; INT
  (type :int32)   ; WINSOCK_SOCKET_TYPE
  (protocol :int32))   ; INT
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $socket = Win32::API::More->new('WS2_32',
    'WPARAM socket(int af, int type, int protocol)');
# my $ret = $socket->Call($af, $type, $protocol);
# af : INT -> int
# type : WINSOCK_SOCKET_TYPE -> int
# protocol : INT -> int
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目
使用する型