socket関数は指定されたトランスポートサービスプロバイダにバインドされるソケットを作成します。
SOCKET socket( int af, // address family int type, // socket type int protocol // protocol );
WS2_32.DLL
アドレスファミリを指定します。指定可能なアドレスファミリの値が Winsock2.h ヘッダファイルで定義されています。
Windows Vista以降向けにリリースされているWindows SDKでは、ヘッダファイルの構成が変更され、指定可能なアドレスファミリの値が Ws2def.h ヘッダファイルで定義されています。 Ws2def.h ヘッダファイルは Winsock2.h でインクルードされており、決して Ws2def.h を直接使用するべきではないことに注意してください。
現在サポートされている値はAF_INETおよびAF_INET6で、これらはInternetアドレスファミリIPv4およびIPv6です。アドレスファミリのその他のオプション(例えば、NetBIOS用に使用されるAF_NETBIOS)は、そのアドレスファミリ用のWindows Socketsサービスプロバイダがインストールされている場合にサポートされます。AF_アドレスファミリとPF_プロトコルファミリ定数の値は同一であり、どちらか一方の定数を使用できる点に注意してください。
以下の表はアドレスファミリの一般的な値を示しています(これら以外にも多くの値が指定可能です)。
この値は下位互換性のために定義されており、この値を使用することは推奨されません。
このアドレスファミリはNWLink IPX/SPX NetBIOS互換トランスポートプロトコルがインストールされている場合にのみサポートされます。このアドレスファミリはWindows Vista以降ではサポートされていません。
このアドレスファミリはAppleTalkプロトコルがインストールされている場合にのみサポートされます。このアドレスファミリはWindows Vista以降ではサポートされていません。
このアドレスファミリはWindows Sockets provider for NetBIOSがインストールされている場合にのみサポートされます。
このアドレスファミリはコンピュータが赤外線ポートを持ち、ドライバがインストールされている場合にのみサポートされます。
このアドレスファミリはコンピュータがBluetoothアダプタを持ち、ドライバがインストールされている場合にWindows XP SP2以降でサポートされます。
新しく作成されるソケットのタイプを指定します。指定可能なソケットタイプの値が Winsock2.h ヘッダファイルで定義されえています。
以下の表はWindows Sockets 2でサポートされているtypeパラメータの値を示しています。
OOBデータ送信メカニズムを持つ、シーケンス化された信頼性の高い双方向のコネクション指向のバイトストリームを提供します。このソケットタイプはInternetアドレスファミリに対してTCPを使用します。
コネクションレスで信頼性の低い固定の(一般的には小さい)最大長を持つバッファのデータグラムをサポートします。このソケットタイプはInternetアドレスファミリに対してUDPを使用します。
アプリケーションが次の上位層プロトコルヘッダを操作できるようにするRAWソケットを提供します。IPv4ヘッダを操作するにはIP_HDRINCLソケットオプションが設定されなければなりません。IPv6ヘッダを操作するにはIPV6_HDRINCLソケットオプションが設定されなければなりません。
信頼性の高いメッセージデータグラムを提供します。このタイプの例としてWindowsにおけるPragmatic General Multicast (PGM)マルチキャストプロトコルの実装があり、しばしば高信頼マルチキャストプログラミングと呼ばれます。このタイプはReliable Multicast Protocolがインストールされている場合にのみサポートされます。
データグラムベースの擬似ストリームパケットを提供します。
新しいソケットタイプがWindows Socket 2で導入されました。アプリケーションは、WSAEnumPortProtocols関数を使用して利用可能なトランスポートプロトコルの属性を動的に見つけることができます。これにより、アプリケーションはアドレスファミリに対して使用可能なソケットタイプとプロトコルオプションを決定し、その情報をこのパラメータを指定する際に使用することができます。 Winsock2.h および Ws2def.h ヘッダ内のソケットタイプ定義は、新しいソケットタイプ、アドレスファミリ、プロトコルが定義されるたびに定期的に更新されます。
Windows Sockets 1.1ではSOCK_STREAM、SOCK_DGREAMのみがサポートされます。
使用するプロトコルを指定します。protocolパラメータに指定可能な値は、指定されたアドレスファミリおよびソケットタイプに特有のものです。protocolパラメータに指定可能な値は Winsock2.h および Wsrm.h ヘッダファイルで定義されています。
Windows Vista以降向けにリリースされているWindows SDKでは、ヘッダファイルの構成が変更され、このパラメータは Ws2def.h ヘッダファイルで定義されているIPPROTO列挙型の値の1つである可能性があります。 Ws2def.h ヘッダファイルは Winsock2.h でインクルードされており、決して Ws2def.h を直接使用するべきではないことに注意してください。
値0を指定した場合は、プロトコルが呼び出し側により指定されず、サービスプロバイダが使用するプロトコルを選択します。
afパラメータがAF_INETまたはAF_INET6であり、typeパラメータがSOCK_RAWの場合は、protocolに指定された値がIPv4またはIPv6パケットヘッダのプロトコルフィールドに設定されます。
以下の表はprotocolに指定される一般的な値を示しています(これら以外にも多くの値が指定可能です)。
この値はafパラメータがAF_BTHであり、typeパラメータがSOCK_STREAMである場合に指定可能です。このプロトコルはWindows XP SP2以降でサポートされています。
この値はafパラメータがAF_INETまたはAF_INET6であり、typeパラメータがSOCK_STREAMである場合に指定可能です。
この値はafパラメータがAF_INETまたはAF_INET6であり、typeパラメータがSOCK_DGRAMである場合に指定可能です。
この値はafパラメータがAF_INETであり、typeパラメータがSOCK_RDMである場合に指定可能です。Windows Vista以降向けにリリースされているWindows SDKでは、この値はIPPROTO_PGMとしても定義されています。このプロトコルはReliable Multicast Protocolがインストールされている場合にのみサポートされます。
成功すると新たに作成されたソケットを参照するディスクリプタを返します。
失敗すると-1 (INVALID_SOCKET) を返します。特定のエラーコードを取得するにはWSAGetLastError関数を呼び出します。
これ以上のソケットディスクリプタを使用することはできません。
ブロッキングWindows Sockets 1.1呼び出しが実行中であるか、サービスプロバイダがコールバック関数を実行中です。
指定されたプロトコルはこのソケットに対して適切ではありません。
指定されたプロトコルはサポートされていません。
指定されたソケットタイプはこのアドレスファミリでサポートされていません。
指定されたアドレスファミリはサポートされていません。
ネットワークサブシステムまたは関連するサービスプロバイダが失敗しました。
利用可能なバッファ領域がありません。
この関数を呼び出す前にWSAStartup関数の呼び出しが成功していなければなりません。
socket関数は、ソケットディスクリプタおよび関連するリソースを確保し、指定されたトランスポートサービスプロバイダに結びつけます。Winsockは要求されたアドレスファミリ、ソケットタイプ、プロトコルの組をサポートする、最初の利用可能なサービスプロバイダを利用します。作成されたソケットはデフォルトでオーバーラップ属性を持ちます。Windowsでは、 Mswsock.h で定義されているMicrosoft独自のソケットオプションSO_OPENTYPEがこのデフォルトに影響します。SO_OPENTYPEの詳細な記述についてはMicrosoft独自の事項に関する文書を参照してください。
WSASocket関数を用いてオーバーラップ(重複)属性を持たないソケットを作成することができます。オーバーラップ操作が可能なすべての関数(WSASend, WSARecv, WSASendTo, WSARecvFrom, WSAIoctl)は、オーバーラップ操作に関するパラメータにNULLを指定することで、オーバーラップ属性を持つソケットに対する非オーバーラップ操作もサポートします。
プロトコルおよびプロトコルがサポートするサービスプロバイダを選定する際に、この関数は基本プロトコルまたはプロトコルチェーンを選択しますが、自動的にプロトコル層を選択しません。チェーンされないプロトコル層間ではtypeやafが部分的にも一致することはないものとみなされます。すなわち、適合するプロトコルが見つからない場合に、WSAEAFNOSUPPORTやWSAEPROTONOSUPPORTエラーコードが返されません。
SOCK_STREAMのようなコネクション指向のソケットは全二重のコネクションを提供しており、データを送受信する前に接続された状態にしなければなりません。connect関数の呼び出しにより別のソケットへのコネクションが作成されます。接続されると、sendおよびrecv呼び出しを使用してデータを送信することができます。セッションが完了したらclosesocketを呼び出さなければなりません。
信頼性の高いコネクション指向のソケットを実装するために使用される通信プロトコルは、データの喪失や重複が発生しないことを保証します。ピアプロトコルが持つバッファ領域のデータがある程度の時間以内に正常に送信できない場合は、コネクションが切れたとみなし、次の呼び出しがエラーコードWSAETIMEDOUTで失敗します。
非接続型メッセージ指向ソケットは、sendtoおよびrecvfromを使用して任意のピア(相手側ソケット)との間でデータグラムを送受信することを可能とします。このようなソケットを特定のピアと接続する場合、sendを使用してある特定のピアへデータグラムを送信したり、recvを使用してある特定のピアからのデータグラムのみを受信したりすることができます。
SOCK_RAWのソケットタイプを持つソケットを受け取る場合、IPv6とIPv4では動作が異なります。IPv4はパケットペイロード(ヘッダを除くデータ本体)、次の上位レベルヘッダ(たとえばTCPやUDPパケットのIPヘッダ)、およびIPv4パケットヘッダを含むパケットを受け取ります。IPv6はペイロードと次の上位レベルヘッダを含むパケットを受け取ります。IPv6がIPv6パケットヘッダを含むパケットを受け取ることはありません。
Windows NTでは、RAWソケットをサポートするには管理者権限が必要です。
ソケットタイプSOCK_SEQPACKETのソケットはデータグラムベースですが、擬似ストリームプロトコルとして機能します。送信パケットと受信パケットの両方に対して分割データグラムが使用されます。ただし、Windows Socketsは複数の受信パケットを単一パケットにまとめる場合があります。そのため、アプリケーションは受信呼び出し(recvやWSARecvExなど)を発行して、1回の呼び出しでそれぞれのまとめられた複合パケットからデータを取得することができます。AF_NETBIOSアドレスファミリはtypeパラメータとしてSOCK_SEQPACKETをサポートします。
NetBIOS over TCP/IPのためにAF_NETBIOSをafパラメータに指定する場合、typeパラメータにSOCK_DGRAMまたはSOCK_SEQPACKETを指定することができます。AF_NETBIOSアドレスファミリに対して、protocolパラメータは負数であらわされるLANアダプタ番号です。
Windows XP以降では、以下のコマンドを使用してWindows Socketsカタログをリストアップし、インストールされているサービスプロバイダとサポートされているアドレスファミリ、ソケットタイプ、プロトコルを決定することができます。
netsh winsock show catalog
ソケットタイプSOCK_RAWのソケットのサポートは必須ではありませんが、サービスプロバイダは可能であればRAWパケットをサポートすることが推奨されます。
以下のことに注意を払う必要があります。
Windows 95 以降 / Windows NT 3.1 以降