ソケット—低レベルネットワークインターフェース—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.9/library/socket
移動先:案内検索

socket —低レベルのネットワークインターフェイス

ソースコード: :source: `Lib / socket.py`



このモジュールは、BSD socket インターフェースへのアクセスを提供します。 これは、すべての最新のUnixシステム、Windows、MacOS、およびおそらく追加のプラットフォームで利用できます。

ノート

オペレーティングシステムのソケットAPIが呼び出されるため、一部の動作はプラットフォームに依存する場合があります。


Pythonインターフェースは、ソケット用のUnixシステムコールとライブラリインターフェースをPythonのオブジェクト指向スタイルに簡単に変換したものです。 socket()関数は、さまざまなメソッドを実装するソケットオブジェクトを返します。ソケットシステムコール。 パラメータタイプはCインターフェイスよりもいくらか高レベルです。Pythonファイルでのread()およびwrite()操作と同様に、受信操作でのバッファ割り当ては自動であり、バッファ長は送信操作で暗黙的です。

も参照してください

モジュール socketserver
ネットワークサーバーの作成を簡素化するクラス。
モジュール ssl
ソケットオブジェクトのTLS / SSLラッパー。


ソケットファミリ

システムとビルドオプションに応じて、このモジュールではさまざまなソケットファミリがサポートされます。

特定のソケットオブジェクトに必要なアドレス形式は、ソケットオブジェクトの作成時に指定されたアドレスファミリに基づいて自動的に選択されます。 ソケットアドレスは次のように表されます。

  • ファイルシステムノードにバインドされた AF_UNIX ソケットのアドレスは、ファイルシステムエンコーディングと'surrogateescape'エラーハンドラーを使用して文字列として表されます( を参照)。 PEP 383 )。 Linuxの抽象名前空間のアドレスは、最初のnullバイトを持つバイトのようなオブジェクトとして返されます。 この名前空間のソケットは通常のファイルシステムソケットと通信できるため、Linuxで実行することを目的としたプログラムは、両方のタイプのアドレスを処理する必要がある場合があることに注意してください。 文字列またはバイトのようなオブジェクトは、引数として渡すときにどちらのタイプのアドレスにも使用できます。

    バージョン3.3で変更:以前は、 AF_UNIX ソケットパスはUTF-8エンコーディングを使用すると想定されていました。

    バージョン3.5で変更:書き込み可能なバイトのようなオブジェクトが受け入れられるようになりました。

  • ペア(host, port)AF_INET アドレスファミリに使用されます。ここで、 host は、'daring.cwi.nl'のようなインターネットドメイン表記のホスト名または'100.50.200.5'ポートなどのIPv4アドレスは整数です。

    • IPv4アドレスの場合、ホストアドレスの代わりに2つの特別な形式が受け入れられます。はすべてのインターフェイスにバインドするために使用されるINADDR_ANYを表し、文字列'<broadcast>'INADDR_BROADCAST。 この動作はIPv6と互換性がないため、PythonプログラムでIPv6をサポートする場合は、これらを回避することをお勧めします。

  • AF_INET6 アドレスファミリの場合、4タプル(host, port, flowinfo, scope_id)が使用されます。ここで、 flowinfo および scope_idsin6_flowinfoおよび[ Cのstruct sockaddr_in6のX144X] メンバー。 socket モジュールメソッドの場合、下位互換性のために flowinfo および scope_id を省略できます。 ただし、 scope_id を省略すると、スコープ付きIPv6アドレスの操作で問題が発生する可能性があることに注意してください。

    バージョン3.7で変更:マルチキャストアドレスの場合( scope_id が意味を持つ)アドレスには%scope_id(またはzone id)が含まれない場合があります部。 この情報は不要であり、安全に省略できます(推奨)。

  • AF_NETLINKソケットは、ペア(pid, groups)として表されます。

  • LinuxのみのTIPCのサポートは、AF_TIPCアドレスファミリーを使用して利用できます。 TIPCは、クラスター化されたコンピューター環境で使用するために設計された、オープンな非IPベースのネットワークプロトコルです。 アドレスはタプルで表され、フィールドはアドレスタイプによって異なります。 一般的なタプル形式は(addr_type, v1, v2, v3 [, scope])です。ここで、

    • addr_type は、TIPC_ADDR_NAMESEQTIPC_ADDR_NAME、またはTIPC_ADDR_IDのいずれかです。

    • スコープは、TIPC_ZONE_SCOPETIPC_CLUSTER_SCOPE、およびTIPC_NODE_SCOPEのいずれかです。

    • addr_typeTIPC_ADDR_NAMEの場合、 v1 はサーバーの種類、 v2 はポート識別子、 v3 はポート識別子です。 0になります。

      addr_typeTIPC_ADDR_NAMESEQの場合、 v1 はサーバーの種類、 v2 は小さい方のポート番号、 v3 は上位ポート番号です。

      addr_typeTIPC_ADDR_IDの場合、 v1 がノード、 v2 が参照、 v3 を設定する必要があります0に。

  • タプル(interface, )は、 AF_CAN アドレスファミリに使用されます。ここで、 interface は、'can0'のようなネットワークインターフェイス名を表す文字列です。 ネットワークインターフェイス名は、このファミリのすべてのネットワークインターフェイスからパケットを受信するために使用できます。

    • CAN_ISOTP プロトコルには、タプル(interface, rx_addr, tx_addr)が必要です。ここで、両方の追加パラメーターは、CAN識別子(標準または拡張)を表す符号なし長整数です。

    • CAN_J1939 プロトコルには、タプル(interface, name, pgn, addr)が必要です。ここで、追加のパラメーターは、ECU名を表す64ビットの符号なし整数、パラメーターグループ番号(PGN)を表す32ビットの符号なし整数、および8です。アドレスを表すビット整数。

  • PF_SYSTEMファミリのSYSPROTO_CONTROLプロトコルには、文字列またはタプル(id, unit)が使用されます。 文字列は、動的に割り当てられたIDを使用するカーネルコントロールの名前です。 タプルは、カーネルコントロールのIDとユニット番号がわかっている場合、または登録済みのIDが使用されている場合に使用できます。

    バージョン3.3の新機能。

  • AF_BLUETOOTHは、次のプロトコルとアドレス形式をサポートしています。

    • BTPROTO_L2CAP(bdaddr, psm)を受け入れます。ここで、bdaddrは文字列としてのBluetoothアドレスであり、psmは整数です。

    • BTPROTO_RFCOMM(bdaddr, channel)を受け入れます。ここで、bdaddrは文字列としてのBluetoothアドレスであり、channelは整数です。

    • BTPROTO_HCIは、(device_id,)を受け入れます。ここで、device_idは、インターフェイスのBluetoothアドレスを持つ整数または文字列です。 (これはOSによって異なります。NetBSDとDragonFlyBSDはBluetoothアドレスを期待しますが、他のすべては整数を期待します。)

      バージョン3.2で変更: NetBSDおよびDragonFlyBSDのサポートが追加されました。

    • BTPROTO_SCOは、bdaddrを受け入れます。ここで、bdaddrは、Bluetoothアドレスを文字列形式で含む bytes オブジェクトです。 (元。 b'12:23:34:45:56:67')このプロトコルはFreeBSDではサポートされていません。

  • AF_ALG は、カーネル暗号化へのLinux専用のソケットベースのインターフェースです。 アルゴリズムソケットは、2〜4要素のタプル(type, name [, feat [, mask]])で構成されます。ここで、

    • type は、文字列としてのアルゴリズムタイプです。例: aeadhashskcipher、またはrng

    • name は、文字列としてのアルゴリズム名と操作モードです。例: sha256hmac(sha256)cbc(aes)、またはdrbg_nopr_ctr_aes256

    • feat およびマスクは符号なし32ビット整数です。

    バージョン3.6の新機能。

  • AF_VSOCK は、仮想マシンとそのホスト間の通信を可能にします。 ソケットは(CID, port)タプルとして表され、コンテキストIDまたはCIDとポートは整数です。

    バージョン3.7の新機能。

  • AF_PACKET は、ネットワークデバイスに直接接続する低レベルのインターフェイスです。 パケットはタプル(ifname, proto[, pkttype[, hatype[, addr]]])で表されます。ここで、

    • ifname -デバイス名を指定する文字列。

    • proto -イーサネットプロトコル番号を指定するネットワークバイトオーダーの整数。

    • pkttype -パケットタイプを指定するオプションの整数:

      • PACKET_HOST(デフォルト)-ローカルホスト宛てのパケット。

      • PACKET_BROADCAST-物理層ブロードキャストパケット。

      • PACKET_MULTIHOST-物理層マルチキャストアドレスに送信されたパケット。

      • PACKET_OTHERHOST-プロミスキャスモードでデバイスドライバーによってキャッチされた他のホストへのパケット。

      • PACKET_OUTGOING-パケットソケットにループバックされるローカルホストから発信されたパケット。

    • hatype -ARPハードウェアアドレスタイプを指定するオプションの整数。

    • addr -ハードウェアの物理アドレスを指定するオプションのバイトのようなオブジェクト。その解釈はデバイスによって異なります。

  • AF_QIPCRTR は、Qualcommプラットフォームのコプロセッサーで実行されているサービスと通信するためのLinux専用のソケットベースのインターフェースです。 アドレスファミリは、(node, port)タプルとして表されます。ここで、ノードおよびポートは非負の整数です。

    バージョン3.8の新機能。

  • IPPROTO_UDPLITEはUDPの変形であり、パケットのどの部分がチェックサムでカバーされるかを指定できます。 変更可能な2つのソケットオプションが追加されます。 self.setsockopt(IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV, length)は、送信パケットのどの部分がチェックサムでカバーされるかを変更し、self.setsockopt(IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV, length)は、データのカバーが少なすぎるパケットを除外します。 どちらの場合も、lengthrange(8, 2**16, 8)にある必要があります。

    このようなソケットは、IPv4の場合はsocket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE)、IPv6の場合はsocket(AF_INET6, SOCK_DGRAM, IPPROTO_UDPLITE)で構築する必要があります。

    バージョン3.9の新機能。

IPv4 / v6ソケットアドレスの host 部分でホスト名を使用すると、PythonがDNS解決から返された最初のアドレスを使用するため、プログラムが非決定的な動作を示す場合があります。 ソケットアドレスは、DNS解決やホスト構成の結果に応じて、実際のIPv4 / v6アドレスに異なる方法で解決されます。 決定論的な動作を行うには、 host の部分に数値アドレスを使用します。

すべてのエラーは例外を発生させます。 無効な引数タイプとメモリ不足状態の通常の例外が発生する可能性があります。 Python 3.3以降、ソケットまたはアドレスのセマンティクスに関連するエラーにより、 OSError またはそのサブクラスの1つが発生します( socket.error を発生させるために使用されていました)。

非ブロッキングモードは、 setblocking()でサポートされています。 タイムアウトに基づくこれの一般化は、 settimeout()によってサポートされます。


モジュールの内容

モジュール socket は、次の要素をエクスポートします。

例外

exception socket.error

OSError の非推奨のエイリアス。

バージョン3.3で変更: PEP 3151 に続いて、このクラスは OSError のエイリアスになりました。

exception socket.herror

OSError のサブクラスであるこの例外は、アドレス関連のエラーに対して発生します。 gethostbyname_ex()gethostbyaddr()など、POSIX CAPIで h_errno を使用する関数の場合。 付随する値は、ライブラリ呼び出しによって返されたエラーを表すペア(h_errno, string)です。 h_errno は数値ですが、 string は、hstrerror() C関数によって返される h_errno の説明を表します。

バージョン3.3で変更:このクラスは OSError のサブクラスになりました。

exception socket.gaierror

OSError のサブクラスであるこの例外は、 getaddrinfo()および getnameinfo()によってアドレス関連のエラーに対して発生します。 付随する値は、ライブラリ呼び出しによって返されたエラーを表すペア(error, string)です。 string は、gai_strerror() C関数によって返されるエラーの説明を表します。 数値のエラー値は、このモジュールで定義されているEAI_*定数の1つと一致します。

バージョン3.3で変更:このクラスは OSError のサブクラスになりました。

exception socket.timeout

OSError のサブクラスであるこの例外は、 settimeout()への以前の呼び出し(または setdefaulttimeout()を介して暗黙的にタイムアウトが有効になっているソケットでタイムアウトが発生した場合に発生します。 ))。 付随する値は、現在常に「タイムアウト」している値の文字列です。

バージョン3.3で変更:このクラスは OSError のサブクラスになりました。


定数

AF_ *およびSOCK_ *定数は、AddressFamilyおよびSocketKind IntEnum コレクションになりました。

バージョン3.4の新機能。


socket.AF_UNIX

socket.AF_INET
socket.AF_INET6

これらの定数は、 socket()の最初の引数に使用されるアドレス(およびプロトコル)ファミリーを表します。 AF_UNIX 定数が定義されていない場合、このプロトコルはサポートされていません。 システムによっては、より多くの定数を使用できる場合があります。
socket.SOCK_STREAM

socket.SOCK_DGRAM
socket.SOCK_RAW
socket.SOCK_RDM
socket.SOCK_SEQPACKET

これらの定数は、 socket()の2番目の引数に使用されるソケットタイプを表します。 システムによっては、より多くの定数を使用できる場合があります。 ( SOCK_STREAMSOCK_DGRAM のみが一般的に役立つようです。)
socket.SOCK_CLOEXEC
socket.SOCK_NONBLOCK

これらの2つの定数は、定義されている場合、ソケットタイプと組み合わせることができ、いくつかのフラグをアトミックに設定できます(したがって、競合状態の可能性や個別の呼び出しの必要性を回避できます)。

も参照してください

より詳細な説明については、セキュアファイル記述子の処理

バージョン3.2の新機能。

SO_*
socket.SOMAXCONN
MSG_*
SOL_*
SCM_*
IPPROTO_*
IPPORT_*
INADDR_*
IP_*
IPV6_*
EAI_*
AI_*
NI_*
TCP_*

ソケットやIPプロトコルに関するUnixのドキュメントに記載されているこれらの形式の定数の多くは、ソケットモジュールでも定義されています。 これらは通常、ソケットオブジェクトのsetsockopt()およびgetsockopt()メソッドの引数で使用されます。 ほとんどの場合、Unixヘッダーファイルで定義されているシンボルのみが定義されます。 いくつかの記号については、デフォルト値が提供されています。

バージョン3.6で変更: SO_DOMAINSO_PROTOCOLSO_PEERSECSO_PASSSECTCP_USER_TIMEOUT、 [ X92X]を追加しました。

バージョン3.6.5で変更: Windowsでは、ランタイムWindowsがサポートしている場合、TCP_FASTOPENTCP_KEEPCNTが表示されます。

バージョン3.7で変更: TCP_NOTSENT_LOWATが追加されました。

Windowsでは、ランタイムWindowsがサポートしている場合、TCP_KEEPIDLETCP_KEEPINTVLが表示されます。

socket.AF_CAN
socket.PF_CAN
SOL_CAN_*
CAN_*

Linuxのドキュメントに記載されているこれらの形式の定数の多くは、ソケットモジュールでも定義されています。

バージョン3.3の新機能。

socket.CAN_BCM
CAN_BCM_*

CANプロトコルファミリのCAN_BCMは、ブロードキャストマネージャ(BCM)プロトコルです。 Linuxのドキュメントに記載されているブロードキャストマネージャー定数も、ソケットモジュールで定義されています。

ノート

CAN_BCM_CAN_FD_FRAMEフラグは、Linux> = 4.8でのみ使用できます。

バージョン3.4の新機能。

socket.CAN_RAW_FD_FRAMES

CAN_RAWソケットでCANFDサポートを有効にします。 これはデフォルトで無効になっています。 これにより、アプリケーションはCANフレームとCANFDフレームの両方を送信できます。 ただし、ソケットから読み取るときは、CANフレームとCANFDフレームの両方を受け入れる必要があります。

この定数は、Linuxのドキュメントに記載されています。

バージョン3.5の新機能。

socket.CAN_RAW_JOIN_FILTERS

適用されたCANフィルターを結合して、指定されたすべてのCANフィルターに一致するCANフレームのみがユーザースペースに渡されるようにします。

この定数は、Linuxのドキュメントに記載されています。

バージョン3.9の新機能。

socket.CAN_ISOTP

CANプロトコルファミリのCAN_ISOTPは、ISO-TP(ISO 15765-2)プロトコルです。 Linuxのドキュメントに記載されているISO-TP定数。

バージョン3.7の新機能。

socket.CAN_J1939

CANプロトコルファミリのCAN_J1939は、SAEJ1939プロトコルです。 Linuxのドキュメントに記載されているJ1939定数。

バージョン3.9の新機能。

socket.AF_PACKET

socket.PF_PACKET
PACKET_*

Linuxのドキュメントに記載されているこれらの形式の定数の多くは、ソケットモジュールでも定義されています。
socket.AF_RDS
socket.PF_RDS
socket.SOL_RDS
RDS_*

Linuxのドキュメントに記載されているこれらの形式の定数の多くは、ソケットモジュールでも定義されています。

バージョン3.3の新機能。

socket.SIO_RCVALL
socket.SIO_KEEPALIVE_VALS
socket.SIO_LOOPBACK_FAST_PATH
RCVALL_*

WindowsのWSAIoctl()の定数。 定数は、ソケットオブジェクトの ioctl()メソッドへの引数として使用されます。

バージョン3.6で変更: SIO_LOOPBACK_FAST_PATHが追加されました。

TIPC_*
CソケットAPIによってエクスポートされたものと一致するTIPC関連の定数。 詳細については、TIPCのドキュメントを参照してください。
socket.AF_ALG
socket.SOL_ALG
ALG_*

Linuxカーネル暗号化の定数。

バージョン3.6の新機能。

socket.AF_VSOCK
socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
VMADDR*
SO_VM*

Linuxホスト/ゲスト通信の定数。

バージョン3.7の新機能。

socket.AF_LINK

バージョン3.4の新機能。

socket.has_ipv6
この定数には、このプラットフォームでIPv6がサポートされているかどうかを示すブール値が含まれています。
socket.BDADDR_ANY

socket.BDADDR_LOCAL

これらは、特別な意味を持つBluetoothアドレスを含む文字列定数です。 たとえば、 BDADDR_ANY は、BTPROTO_RFCOMMでバインディングソケットを指定するときに、任意のアドレスを示すために使用できます。
socket.HCI_FILTER

socket.HCI_TIME_STAMP
socket.HCI_DATA_DIR

BTPROTO_HCIで使用します。 HCI_FILTER は、NetBSDまたはDragonFlyBSDでは使用できません。 HCI_TIME_STAMP および HCI_DATA_DIR は、FreeBSD、NetBSD、またはDragonFlyBSDでは使用できません。
socket.AF_QIPCRTR
QualcommのIPCルータープロトコルの定数。リモートプロセッサを提供するサービスとの通信に使用されます。


関数

ソケットの作成

以下の関数はすべてソケットオブジェクトを作成します。

socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)

指定されたアドレスファミリ、ソケットタイプ、およびプロトコル番号を使用して、新しいソケットを作成します。 アドレスファミリは、 AF_INET (デフォルト)、 AF_INET6AF_UNIXAF_CANAF_PACKET 、または AF_RDS 。 ソケットタイプは、 SOCK_STREAM (デフォルト)、 SOCK_DGRAMSOCK_RAW 、または他のSOCK_定数のいずれかである必要があります。 プロトコル番号は通常ゼロで省略できます。アドレスファミリが AF_CAN の場合、プロトコルはCAN_RAWCAN_BCMのいずれかになります。 CAN_ISOTP または CAN_J1939

fileno が指定されている場合、 familytype 、および proto の値は指定されたファイル記述子から自動検出されます。 自動検出は、明示的なファミリタイプ、またはプロト引数を使用して関数を呼び出すことで無効にできます。 これは、Pythonがどのように表現するかにのみ影響します。 socket.getpeername()の戻り値ですが、実際のOSリソースではありません。 socket.fromfd()とは異なり、 fileno は同じソケットを返し、重複は返しません。 これは、 socket.close()を使用して切り離されたソケットを閉じるのに役立つ場合があります。

新しく作成されたソケットは継承不可です。

バージョン3.3で変更: AF_CANファミリが追加されました。 AF_RDSファミリが追加されました。

バージョン3.4で変更: CAN_BCMプロトコルが追加されました。

バージョン3.4で変更:返されたソケットは継承できなくなりました。

バージョン3.7で変更: CAN_ISOTPプロトコルが追加されました。

バージョン3.7で変更: SOCK_NONBLOCK または SOCK_CLOEXEC ビットフラグが type に適用されると、それらはクリアされ、 socket.type はそれらを反映しません。 それらは引き続き基礎となるシステム socket()呼び出しに渡されます。 したがって、

sock = socket.socket(
    socket.AF_INET,
    socket.SOCK_STREAM | socket.SOCK_NONBLOCK)

SOCK_NONBLOCKをサポートするOSで非ブロッキングソケットを作成しますが、sock.typesocket.SOCK_STREAMに設定されます。

バージョン3.9で変更: CAN_J1939プロトコルが追加されました。

socket.socketpair([family[, type[, proto]]])

指定されたアドレスファミリ、ソケットタイプ、およびプロトコル番号を使用して、接続されたソケットオブジェクトのペアを構築します。 アドレスファミリ、ソケットタイプ、プロトコル番号は、上記の socket()関数と同じです。 プラットフォームで定義されている場合、デフォルトのファミリは AF_UNIX です。 それ以外の場合、デフォルトは AF_INET です。

新しく作成されたソケットは継承不可です。

バージョン3.2で変更:返されるソケットオブジェクトは、サブセットではなく、ソケットAPI全体をサポートするようになりました。

バージョン3.4で変更:返されるソケットは継承できなくなりました。

バージョン3.5で変更: Windowsサポートが追加されました。

socket.create_connection(address[, timeout[, source_address]])

インターネットアドレス(2タプル(host, port))でリッスンしているTCPサービスに接続し、ソケットオブジェクトを返します。 これは socket.connect()よりも高レベルの関数です。 host が数値以外のホスト名の場合、両方の AF_INET に対して解決を試みます。および AF_INET6 を選択し、接続が成功するまで、考えられるすべてのアドレスに順番に接続してみます。 これにより、IPv4とIPv6の両方と互換性のあるクライアントを簡単に作成できます。

オプションの timeout パラメーターを渡すと、接続を試行する前にソケットインスタンスのタイムアウトが設定されます。 timeout が指定されていない場合、 getdefaulttimeout()によって返されるグローバルデフォルトタイムアウト設定が使用されます。

指定する場合、接続する前にソケットを送信元アドレスとしてバインドするには、 source_address を2タプル(host, port)にする必要があります。 ホストまたはポートがそれぞれ または0の場合、OSのデフォルトの動作が使用されます。

バージョン3.2で変更: source_address が追加されました。

socket.create_server(address, *, family=AF_INET, backlog=None, reuse_port=False, dualstack_ipv6=False)

アドレス(2タプル(host, port))にバインドされたTCPソケットを作成し、ソケットオブジェクトを返す便利な関数。

ファミリは、 AF_INET または AF_INET6 のいずれかである必要があります。 backlog は、 socket.listen()に渡されるキューサイズです。 0の場合、デフォルトの妥当な値が選択されます。 reuse_port は、SO_REUSEPORTソケットオプションを設定するかどうかを指定します。

dualstack_ipv6 がtrueで、プラットフォームがそれをサポートしている場合、ソケットはIPv4接続とIPv6接続の両方を受け入れることができます。そうでない場合、 ValueError が発生します。 ほとんどのPOSIXプラットフォームとWindowsは、この機能をサポートすることになっています。 この機能を有効にすると、IPv4接続が発生したときに socket.getpeername()によって返されるアドレスは、IPv4にマップされたIPv6アドレスとして表されるIPv6アドレスになります。 dualstack_ipv6 がfalseの場合、デフォルトで有効になっているプラットフォームでこの機能を明示的に無効にします(例: Linux)。 このパラメーターは、 has_dualstack_ipv6()と組み合わせて使用できます。

import socket

addr = ("", 8080)  # all interfaces, port 8080
if socket.has_dualstack_ipv6():
    s = socket.create_server(addr, family=socket.AF_INET6, dualstack_ipv6=True)
else:
    s = socket.create_server(addr)

ノート

POSIXプラットフォームでは、SO_REUSEADDRソケットオプションが設定され、同じアドレスにバインドされ、TIME_WAIT状態のままであった以前のソケットをすぐに再利用します。

バージョン3.8の新機能。

socket.has_dualstack_ipv6()

プラットフォームがIPv4接続とIPv6接続の両方を処理できるTCPソケットの作成をサポートしている場合は、Trueを返します。

バージョン3.8の新機能。

socket.fromfd(fd, family, type, proto=0)

ファイル記述子 fd (ファイルオブジェクトのfileno()メソッドによって返される整数)を複製し、その結果からソケットオブジェクトを構築します。 アドレスファミリ、ソケットタイプ、プロトコル番号は、上記の socket()関数と同じです。 ファイル記述子はソケットを参照する必要がありますが、これはチェックされません。ファイル記述子が無効な場合、オブジェクトに対する後続の操作が失敗する可能性があります。 この関数が必要になることはめったにありませんが、標準の入力または出力としてプログラムに渡されるソケット(Unix inetデーモンによって起動されるサーバーなど)でソケットオプションを取得または設定するために使用できます。 ソケットはブロッキングモードであると見なされます。

新しく作成されたソケットは継承不可です。

バージョン3.4で変更:返されたソケットは継承できなくなりました。

socket.fromshare(data)

socket.share()メソッドから取得したデータからソケットをインスタンス化します。 ソケットはブロッキングモードであると見なされます。

バージョン3.3の新機能。

socket.SocketType
これは、ソケットオブジェクトタイプを表すPythonタイプオブジェクトです。 type(socket(...))と同じです。


その他の機能

socket モジュールは、さまざまなネットワーク関連サービスも提供します。

socket.close(fd)

ソケットファイル記述子を閉じます。 これは os.close()に似ていますが、ソケット用です。 一部のプラットフォーム(最も目立つWindows)では、 os.close()はソケットファイル記述子に対して機能しません。

バージョン3.7の新機能。

socket.getaddrinfo(host, port, family=0, type=0, proto=0, flags=0)

host / port 引数を、そのサービスに接続されたソケットを作成するために必要なすべての引数を含む5タプルのシーケンスに変換します。 host はドメイン名であり、IPv4 / v6アドレスまたはNoneの文字列表現です。 port は、'http'、数値のポート番号、Noneなどの文字列サービス名です。 Nonehost および port の値として渡すことにより、NULLを基盤となるCAPIに渡すことができます。

ファミリタイプ、およびプロト引数は、返されるアドレスのリストを絞り込むためにオプションで指定できます。 これらの各引数の値としてゼロを渡すと、結果の全範囲が選択されます。 flags 引数は、AI_*定数の1つまたは複数にすることができ、結果の計算方法と返される方法に影響を与えます。 たとえば、AI_NUMERICHOSTはドメイン名の解決を無効にし、 host がドメイン名の場合はエラーを発生させます。

この関数は、次の構造を持つ5タプルのリストを返します。

(family, type, proto, canonname, sockaddr)

これらのタプルでは、ファミリタイププロトはすべて整数であり、 socket()関数に渡されることを意図しています。 canonname は、AI_CANONNAMEflags 引数の一部である場合、 host の正規名を表す文字列になります。 それ以外の場合、 canonname は空になります。 sockaddr は、ソケットアドレスを記述するタプルであり、その形式は、返されるファミリAF_INET(address, port) 2-タプル、[ X162X] AF_INET6 )の4タプルであり、 socket.connect()メソッドに渡されることを意図しています。

次の例では、ポート80でexample.orgへの架空のTCP接続のアドレス情報をフェッチします(IPv6が有効になっていない場合、システムによって結果が異なる場合があります)。

>>> socket.getaddrinfo("example.org", 80, proto=socket.IPPROTO_TCP)
[(<AddressFamily.AF_INET6: 10>, <SocketType.SOCK_STREAM: 1>,
 6, '', ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)),
 (<AddressFamily.AF_INET: 2>, <SocketType.SOCK_STREAM: 1>,
 6, '', ('93.184.216.34', 80))]

バージョン3.2で変更:パラメーターをキーワード引数を使用して渡すことができるようになりました。

バージョン3.7で変更: IPv6マルチキャストアドレスの場合、アドレスを表す文字列には%scope_idの部分が含まれません。

socket.getfqdn([name])
name の完全修飾ドメイン名を返します。 name が省略されているか空の場合、ローカルホストとして解釈されます。 完全修飾名を見つけるために、 gethostbyaddr()によって返されるホスト名がチェックされ、利用可能な場合はホストのエイリアスが続きます。 ピリオドを含む名が選択されます。 完全修飾ドメイン名が利用できず、 name が指定された場合、変更されずに返されます。 name が空または'0.0.0.0'と等しい場合、 gethostname()からのホスト名が返されます。
socket.gethostbyname(hostname)
ホスト名をIPv4アドレス形式に変換します。 IPv4アドレスは、'100.50.200.5'などの文字列として返されます。 ホスト名がIPv4アドレス自体の場合、変更されずに返されます。 より完全なインターフェースについては、 gethostbyname_ex()を参照してください。 gethostbyname()はIPv6名前解決をサポートしていません。代わりに、 getaddrinfo()をIPv4 / v6デュアルスタックサポートに使用する必要があります。
socket.gethostbyname_ex(hostname)
ホスト名をIPv4アドレス形式、拡張インターフェースに変換します。 トリプル(hostname, aliaslist, ipaddrlist)を返します。ここで、 hostname はホストのプライマリホスト名、 aliaslist は同じアドレスの代替ホスト名の(空の可能性がある)リスト、[X181X ] ipaddrlist は、同じホスト上の同じインターフェイスのIPv4アドレスのリストです(多くの場合、単一のアドレスであるとは限りません)。 gethostbyname_ex()はIPv6名前解決をサポートしていません。代わりに、 getaddrinfo()をIPv4 / v6デュアルスタックサポートに使用する必要があります。
socket.gethostname()

Pythonインタープリターが現在実行されているマシンのホスト名を含む文字列を返します。

注: gethostname()は、完全修飾ドメイン名を常に返すとは限りません。 そのためには getfqdn()を使用してください。

socket.gethostbyaddr(ip_address)
トリプル(hostname, aliaslist, ipaddrlist)を返します。ここで、 hostname は、指定された ip_address に応答するプライマリホスト名です。 aliaslist は、代替の(おそらく空の)リストです。同じアドレスのホスト名。 ipaddrlist は、同じホスト上の同じインターフェイスのIPv4 / v6アドレスのリストです(ほとんどの場合、単一のアドレスのみが含まれます)。 完全修飾ドメイン名を見つけるには、関数 getfqdn()を使用します。 gethostbyaddr()は、IPv4とIPv6の両方をサポートします。
socket.getnameinfo(sockaddr, flags)

ソケットアドレス sockaddr を2タプル(host, port)に変換します。 フラグの設定に応じて、結果にはホストの完全修飾ドメイン名または数値アドレス表現が含まれる場合があります。 同様に、 port には、文字列のポート名または数値のポート番号を含めることができます。

IPv6アドレスの場合、 sockaddr に意味のある scope_id が含まれていると、%scope_idがホスト部分に追加されます。 通常、これはマルチキャストアドレスで発生します。

フラグの詳細については、 getnameinfo(3)を参照してください。

socket.getprotobyname(protocolname)
インターネットプロトコル名(たとえば、'icmp')を、 socket()関数に(オプションの)3番目の引数として渡すのに適した定数に変換します。 これは通常、「raw」モード( SOCK_RAW )で開かれたソケットにのみ必要です。 通常のソケットモードでは、プロトコルが省略されているかゼロの場合、正しいプロトコルが自動的に選択されます。
socket.getservbyname(servicename[, protocolname])
インターネットサービス名とプロトコル名をそのサービスのポート番号に変換します。 オプションのプロトコル名を指定する場合は、'tcp'または'udp'にする必要があります。そうでない場合、どのプロトコルも一致します。
socket.getservbyport(port[, protocolname])
インターネットポート番号とプロトコル名をそのサービスのサービス名に変換します。 オプションのプロトコル名を指定する場合は、'tcp'または'udp'にする必要があります。そうでない場合、どのプロトコルも一致します。
socket.ntohl(x)
32ビットの正の整数をネットワークからホストのバイト順序に変換します。 ホストのバイト順序がネットワークのバイト順序と同じであるマシンでは、これは何もしません。 それ以外の場合は、4バイトのスワップ操作を実行します。
socket.ntohs(x)

16ビットの正の整数をネットワークからホストのバイトオーダーに変換します。 ホストのバイト順序がネットワークのバイト順序と同じであるマシンでは、これは何もしません。 それ以外の場合は、2バイトのスワップ操作を実行します。

バージョン3.7以降非推奨: x が16ビットの符号なし整数に収まらないが、正のC intに収まる場合、16ビットの符号なし整数にサイレントに切り捨てられます。 このサイレント切り捨て機能は非推奨であり、Pythonの将来のバージョンで例外が発生します。

socket.htonl(x)
32ビットの正の整数をホストからネットワークのバイトオーダーに変換します。 ホストのバイト順序がネットワークのバイト順序と同じであるマシンでは、これは何もしません。 それ以外の場合は、4バイトのスワップ操作を実行します。
socket.htons(x)

16ビットの正の整数をホストからネットワークのバイトオーダーに変換します。 ホストのバイト順序がネットワークのバイト順序と同じであるマシンでは、これは何もしません。 それ以外の場合は、2バイトのスワップ操作を実行します。

バージョン3.7以降非推奨: x が16ビットの符号なし整数に収まらないが、正のC intに収まる場合、16ビットの符号なし整数にサイレントに切り捨てられます。 このサイレント切り捨て機能は非推奨であり、Pythonの将来のバージョンで例外が発生します。

socket.inet_aton(ip_string)

IPv4アドレスをドット付きクワッド文字列形式(たとえば、「123.45.67.89」)から32ビットパックバイナリ形式に、4文字の長さのバイトオブジェクトとして変換します。 これは、標準Cライブラリを使用し、この関数が返す32ビットパックバイナリのCタイプであるタイプ struct in_addr のオブジェクトを必要とするプログラムと会話するときに役立ちます。

inet_aton()は、ドットが3つ未満の文字列も受け入れます。 詳細については、Unixのマニュアルページ inet(3)を参照してください。

この関数に渡されたIPv4アドレス文字列が無効な場合、 OSError が発生します。 正確に何が有効かは、inet_aton()の基礎となるC実装に依存することに注意してください。

inet_aton()はIPv6をサポートしていません。代わりに、 inet_pton()をIPv4 / v6デュアルスタックサポートに使用する必要があります。

socket.inet_ntoa(packed_ip)

32ビットのパックされたIPv4アドレス(バイトのようなオブジェクト 4バイトの長さ)を標準のドット付きクワッド文字列表現(たとえば、「123.45.67.89」)に変換します。 これは、標準Cライブラリを使用し、 struct in_addr 型のオブジェクトを必要とするプログラムと会話する場合に役立ちます。これは、この関数が引数として取る32ビットパックバイナリデータのC型です。

この関数に渡されるバイトシーケンスの長さが正確に4バイトでない場合、 OSError が発生します。 inet_ntoa()はIPv6をサポートしていません。代わりに、 inet_ntop()をIPv4 / v6デュアルスタックサポートに使用する必要があります。

バージョン3.5で変更:書き込み可能なバイトのようなオブジェクトが受け入れられるようになりました。

socket.inet_pton(address_family, ip_string)

IPアドレスをファミリ固有の文字列形式からパックされたバイナリ形式に変換します。 inet_pton()は、ライブラリまたはネットワークプロトコルがタイプ struct in_addr inet_aton()と同様)または structin6_addrのオブジェクトを呼び出す場合に役立ちます。

address_family でサポートされている値は、現在 AF_INET および AF_INET6 です。 IPアドレス文字列 ip_string が無効な場合、 OSError が発生します。 正確に何が有効かは、 address_family の値とinet_pton()の基礎となる実装の両方に依存することに注意してください。

バージョン3.4で変更: Windowsサポートが追加されました

socket.inet_ntop(address_family, packed_ip)

パックされたIPアドレス(バイトのようなオブジェクトのバイト数)を、標準のファミリ固有の文字列表現('7.10.0.5''5aef:2b::8'など)に変換します。 。 inet_ntop()は、ライブラリまたはネットワークプロトコルがタイプ struct in_addr inet_ntoa()と同様)または struct in6_addr [のオブジェクトを返す場合に役立ちます。 X172X]。

address_family でサポートされている値は、現在 AF_INET および AF_INET6 です。 バイトオブジェクト packed_ip が指定されたアドレスファミリの正しい長さでない場合、 ValueError が発生します。 OSError は、 inet_ntop()の呼び出しからのエラーに対して発生します。

バージョン3.4で変更: Windowsサポートが追加されました

バージョン3.5で変更:書き込み可能なバイトのようなオブジェクトが受け入れられるようになりました。

socket.CMSG_LEN(length)

指定された長さの関連データを含む補助データ項目の全長を末尾のパディングなしで返します。 この値は、多くの場合、 recvmsg()が単一の補助データを受信するためのバッファーサイズとして使用できますが、 RFC 3542 では、ポータブルアプリケーションで[ X184X] CMSG_SPACE()であるため、アイテムがバッファー内の最後になる場合でも、パディング用のスペースが含まれます。 length が許容値の範囲外の場合、 OverflowError を発生させます。

バージョン3.3の新機能。

socket.CMSG_SPACE(length)

recvmsg()が、指定された長さの関連データを含む補助データ項目を、末尾のパディングとともに受信するために必要なバッファーサイズを返します。 複数のアイテムを受信するために必要なバッファースペースは、関連するデータ長の CMSG_SPACE()値の合計です。 length が許容値の範囲外の場合、 OverflowError を発生させます。

一部のシステムは、この機能を提供せずに補助データをサポートする場合があることに注意してください。 また、この関数の結果を使用してバッファサイズを設定しても、追加のデータがパディング領域に収まる可能性があるため、受信できる補助データの量が正確に制限されない場合があることに注意してください。

バージョン3.3の新機能。

socket.getdefaulttimeout()
新しいソケットオブジェクトのデフォルトのタイムアウトを秒単位(float)で返します。 Noneの値は、新しいソケットオブジェクトにタイムアウトがないことを示します。 ソケットモジュールが最初にインポートされるとき、デフォルトはNoneです。
socket.setdefaulttimeout(timeout)
新しいソケットオブジェクトのデフォルトのタイムアウトを秒(float)で設定します。 ソケットモジュールが最初にインポートされるとき、デフォルトはNoneです。 可能な値とそれぞれの意味については、 settimeout()を参照してください。
socket.sethostname(name)

マシンのホスト名を name に設定します。 十分な権限がない場合、これにより OSError が発生します。

バージョン3.3の新機能。

socket.if_nameindex()

ネットワークインターフェイス情報(インデックスint、名前文字列)タプルのリストを返します。 OSError システムコールが失敗した場合。

バージョン3.3の新機能。

バージョン3.8で変更: Windowsサポートが追加されました。

ノート

Windowsネットワークでは、インターフェイスの名前はコンテキストによって異なります(すべての名前は例です)。

  • UUID:{FB605B73-AAC2-49A6-9A2F-25416AEA0573}

  • 名前:ethernet_32770

  • わかりやすい名前:vEthernet (nat)

  • 説明:Hyper-V Virtual Ethernet Adapter

この関数は、リストから2番目の形式の名前(この例ではethernet_32770)を返します。

socket.if_nametoindex(if_name)

インターフェイス名に対応するネットワークインターフェイスインデックス番号を返します。 OSError 指定された名前のインターフェイスが存在しない場合。

バージョン3.3の新機能。

バージョン3.8で変更: Windowsサポートが追加されました。

も参照してください

「インターフェース名」は、 if_nameindex()に記載されている名前です。

socket.if_indextoname(if_index)

インターフェイスインデックス番号に対応するネットワークインターフェイス名を返します。 OSError 指定されたインデックスのインターフェイスが存在しない場合。

バージョン3.3の新機能。

バージョン3.8で変更: Windowsサポートが追加されました。

も参照してください

「インターフェース名」は、 if_nameindex()に記載されている名前です。

socket.send_fds(sock, buffers, fds[, flags[, address]])

ファイル記述子のリスト fdsAF_UNIX ソケット sock を介して送信します。 fds パラメーターは、ファイル記述子のシーケンスです。 これらのパラメータのドキュメントについては、sendmsg()を参照してください。

バージョン3.9の新機能。

socket.recv_fds(sock, bufsize, maxfds[, flags])

AF_UNIX ソケット sock から最大 maxfds ファイル記述子を受信します。 (msg, list(fds), flags, addr)を返します。 これらのパラメータのドキュメントについては、recvmsg()を参照してください。

バージョン3.9の新機能。

ノート

ファイル記述子のリストの最後にある切り捨てられた整数。


ソケットオブジェクト

ソケットオブジェクトには次のメソッドがあります。 makefile()を除いて、これらはソケットに適用可能なUnixシステムコールに対応します。

バージョン3.2で変更: コンテキストマネージャープロトコルのサポートが追加されました。 コンテキストマネージャを終了することは、 close()を呼び出すことと同じです。


socket.accept()

接続を受け入れます。 ソケットはアドレスにバインドされ、接続をリッスンする必要があります。 戻り値はペア(conn, address)です。ここで、 conn は接続でデータを送受信するために使用できる new ソケットオブジェクトであり、 address は接続のもう一方の端にあるソケットにバインドされているアドレス。

新しく作成されたソケットは継承不可です。

バージョン3.4で変更:ソケットは継承できなくなりました。

バージョン3.5で変更:システムコールが中断され、シグナルハンドラが例外を発生させない場合、メソッドは InterruptedError 例外を発生させる代わりに、システムコールを再試行するようになりました([X221Xを参照] ] PEP 475 (理論的根拠)。

socket.bind(address)
ソケットをアドレスにバインドします。 ソケットはまだバインドされていない必要があります。 (アドレスの形式はアドレスファミリによって異なります—上記を参照してください。)
socket.close()

ソケットを閉じたとマークします。 基盤となるシステムリソース(例: makefile()のすべてのファイルオブジェクトが閉じられると、ファイル記述子)も閉じられます。 これが発生すると、ソケットオブジェクトに対する今後のすべての操作は失敗します。 リモートエンドはそれ以上データを受信しません(キューに入れられたデータがフラッシュされた後)。

ソケットはガベージコレクションされると自動的に閉じられますが、明示的に close()するか、 with ステートメントを使用することをお勧めします。

バージョン3.6で変更:基になるclose()呼び出しが行われたときにエラーが発生した場合、 OSError が発生するようになりました。

ノート

close()は、接続に関連付けられているリソースを解放しますが、必ずしもすぐに接続を閉じるとは限りません。 タイムリーに接続を閉じたい場合は、 close()の前に shutdown()を呼び出してください。

socket.connect(address)

アドレスのリモートソケットに接続します。 (アドレスの形式はアドレスファミリによって異なります—上記を参照してください。)

接続がシグナルによって中断された場合、メソッドは接続が完了するまで待機するか、シグナルハンドラーが例外を発生させず、ソケットがブロックしている、またはソケットにタイムアウト。 非ブロッキングソケットの場合、接続がシグナル(またはシグナルハンドラーによって発生した例外)によって中断された場合、メソッドは InterruptedError 例外を発生させます。

バージョン3.5で変更:接続がシグナルによって中断された場合、 InterruptedError 例外を発生させる代わりに、接続が完了するまでメソッドが待機するようになりました。シグナルハンドラーは例外を発生せず、ソケットがブロックしているか、タイムアウトが発生しています(理由については、 PEP 475 を参照してください)。

socket.connect_ex(address)
connect(address)と同様ですが、Cレベルのconnect()呼び出しによって返されるエラーの例外を発生させる代わりに、エラーインジケーターを返します(「ホストが見つかりません」などの他の問題でも例外が発生する可能性があります) 。 操作が成功した場合、エラーインジケータは0です。それ以外の場合、errno変数の値です。 これは、たとえば非同期接続をサポートするのに役立ちます。
socket.detach()

基になるファイル記述子を実際に閉じずに、ソケットオブジェクトを閉じた状態にします。 ファイル記述子が返され、他の目的で再利用できます。

バージョン3.2の新機能。

socket.dup()

ソケットを複製します。

新しく作成されたソケットは継承不可です。

バージョン3.4で変更:ソケットは継承できなくなりました。

socket.fileno()

ソケットのファイル記述子(小さな整数)を返すか、失敗した場合は-1を返します。 これは、 select.select()で役立ちます。

Windowsでは、このメソッドによって返される小さな整数は、ファイル記述子を使用できる場所では使用できません( os.fdopen()など)。 Unixにはこの制限はありません。

socket.get_inheritable()

ソケットのファイル記述子またはソケットのハンドルの継承可能フラグを取得します。ソケットが子プロセスで継承できる場合はTrue、継承できない場合はFalse

バージョン3.4の新機能。

socket.getpeername()
ソケットが接続されているリモートアドレスを返します。 これは、たとえば、リモートIPv4 / v6ソケットのポート番号を見つけるのに役立ちます。 (返されるアドレスの形式は、アドレスファミリによって異なります。上記を参照してください。)一部のシステムでは、この機能はサポートされていません。
socket.getsockname()
ソケット自体のアドレスを返します。 これは、たとえば、IPv4 / v6ソケットのポート番号を見つけるのに役立ちます。 (返されるアドレスの形式は、アドレスファミリによって異なります。上記を参照してください。)
socket.getsockopt(level, optname[, buflen])
指定されたソケットオプションの値を返します(Unixのマニュアルページ getsockopt(2)を参照)。 必要なシンボリック定数(SO_*など)は、このモジュールで定義されています。 buflen がない場合、整数オプションが想定され、その整数値が関数によって返されます。 buflen が存在する場合、オプションを受け取るために使用されるバッファーの最大長を指定し、このバッファーはバイトオブジェクトとして返されます。 バッファの内容をデコードするのは呼び出し元の責任です(バイト文字列としてエンコードされたC構造体をデコードする方法については、オプションの組み込みモジュール struct を参照してください)。
socket.getblocking()

ソケットがブロッキングモードの場合はTrueを返し、非ブロッキングモードの場合はFalseを返します。

これは、socket.gettimeout() == 0をチェックするのと同じです。

バージョン3.7の新機能。

socket.gettimeout()
ソケット操作に関連するタイムアウトを秒単位(float)で返します。タイムアウトが設定されていない場合は、Noneを返します。 これは、 setblocking()または settimeout()への最後の呼び出しを反映しています。
socket.ioctl(control, option)
プラットホーム

ウィンドウズ

ioctl()メソッドは、WSAIoctlシステムインターフェイスへの制限されたインターフェイスです。 詳細については、 Win32ドキュメントを参照してください。

他のプラットフォームでは、汎用の fcntl.fcntl()および fcntl.ioctl()関数を使用できます。 最初の引数としてソケットオブジェクトを受け入れます。

現在、サポートされている制御コードは、SIO_RCVALLSIO_KEEPALIVE_VALS、およびSIO_LOOPBACK_FAST_PATHのみです。

バージョン3.6で変更: SIO_LOOPBACK_FAST_PATHが追加されました。

socket.listen([backlog])

サーバーが接続を受け入れることができるようにします。 backlog を指定する場合は、少なくとも0である必要があります(低い場合は0に設定されます)。 これは、新しい接続を拒否する前にシステムが許可する、受け入れられない接続の数を指定します。 指定しない場合は、デフォルトの妥当な値が選択されます。

バージョン3.5で変更: backlog パラメーターはオプションになりました。

socket.makefile(mode='r', buffering=None, *, encoding=None, errors=None, newline=None)

ソケットに関連付けられているファイルオブジェクトを返します。 返される正確な型は、 makefile()に指定された引数によって異なります。 これらの引数は、組み込みの open()関数と同じように解釈されますが、サポートされている mode 値は、'r'(デフォルト)、'w'および'b'

ソケットはブロッキングモードである必要があります。 タイムアウトが発生する可能性がありますが、タイムアウトが発生すると、ファイルオブジェクトの内部バッファが不整合な状態になる可能性があります。

makefile()によって返されたファイルオブジェクトを閉じても、他のすべてのファイルオブジェクトが閉じられ、ソケットオブジェクトで socket.close()が呼び出されない限り、元のソケットは閉じられません。

ノート

Windowsでは、 makefile()によって作成されたファイルのようなオブジェクトは、 subprocess.Popen()のストリーム引数など、ファイル記述子を持つファイルオブジェクトが必要な場所では使用できません。 。

socket.recv(bufsize[, flags])

ソケットからデータを受信します。 戻り値は、受信したデータを表すバイトオブジェクトです。 一度に受信できるデータの最大量は、 bufsize で指定されています。 オプションの引数フラグの意味については、Unixのマニュアルページ recv(2)を参照してください。 デフォルトはゼロです。

ノート

ハードウェアおよびネットワークの現実と最適に一致させるには、 bufsize の値を2の比較的小さい累乗、たとえば4096にする必要があります。

バージョン3.5で変更:システムコールが中断され、シグナルハンドラが例外を発生させない場合、メソッドは InterruptedError 例外を発生させる代わりに、システムコールを再試行するようになりました([X221Xを参照] ] PEP 475 (理論的根拠)。

socket.recvfrom(bufsize[, flags])

ソケットからデータを受信します。 戻り値はペア(bytes, address)です。ここで、 bytes は受信したデータを表すバイトオブジェクトであり、 address はデータを送信するソケットのアドレスです。 オプションの引数フラグの意味については、Unixのマニュアルページ recv(2)を参照してください。 デフォルトはゼロです。 (アドレスの形式はアドレスファミリによって異なります—上記を参照してください。)

バージョン3.5で変更:システムコールが中断され、シグナルハンドラが例外を発生させない場合、メソッドは InterruptedError 例外を発生させる代わりに、システムコールを再試行するようになりました([X221Xを参照] ] PEP 475 (理論的根拠)。

バージョン3.7で変更:マルチキャストIPv6アドレスの場合、アドレスの最初の項目に%scope_idの部分が含まれなくなりました。 完全なIPv6アドレスを取得するには、 getnameinfo()を使用します。

socket.recvmsg(bufsize[, ancbufsize[, flags]])

通常のデータ(最大 bufsize バイト)と補助データをソケットから受信します。 ancbufsize 引数は、補助データの受信に使用される内部バッファーのサイズをバイト単位で設定します。 デフォルトは0です。これは、補助データが受信されないことを意味します。 補助データの適切なバッファーサイズは、 CMSG_SPACE()または CMSG_LEN()を使用して計算でき、バッファーに収まらないアイテムは切り捨てられるか、破棄される可能性があります。 flags 引数のデフォルトは0で、 recv()と同じ意味です。

戻り値は4タプルです:(data, ancdata, msg_flags, address)data アイテムは、受信した非補助データを保持する bytes オブジェクトです。 ancdata 項目は、受信した補助データ(制御メッセージ)を表す0個以上のタプル(cmsg_level, cmsg_type, cmsg_data)のリストです。 cmsg_level および cmsg_type は整数です。プロトコルレベルとプロトコル固有のタイプをそれぞれ指定します。 cmsg_data は、関連データを保持する bytes オブジェクトです。 msg_flags 項目は、受信したメッセージの状態を示すさまざまなフラグのビットごとのORです。 詳細については、システムのドキュメントを参照してください。 受信ソケットが接続されていない場合、 address は、使用可能な場合は送信ソケットのアドレスです。 それ以外の場合、その値は指定されていません。

一部のシステムでは、 sendmsg()および recvmsg()を使用して、 AF_UNIX ソケットを介してプロセス間でファイル記述子を渡すことができます。 この機能を使用すると(多くの場合、 SOCK_STREAM ソケットに制限されます)、 recvmsg()は、補助データで(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds)の形式のアイテムを返します。 fds は、新しいファイル記述子をネイティブC int タイプのバイナリ配列として表す bytes オブジェクトです。 システムコールが戻った後に recvmsg()が例外を発生させた場合、最初にこのメカニズムを介して受信したファイル記述子を閉じようとします。

一部のシステムは、部分的にしか受信されていない補助データ項目の切り捨てられた長さを示しません。 アイテムがバッファの終わりを超えて拡張しているように見える場合、 recvmsg()RuntimeWarning を発行し、バッファ内にある部分が返されません。関連するデータの開始前に切り捨てられます。

SCM_RIGHTSメカニズムをサポートするシステムでは、次の関数は最大 maxfds ファイル記述子を受け取り、メッセージデータと記述子を含むリストを返します(無関係な制御メッセージなどの予期しない条件を無視します)受信中)。 sendmsg()も参照してください。

import socket, array

def recv_fds(sock, msglen, maxfds):
    fds = array.array("i")   # Array of ints
    msg, ancdata, flags, addr = sock.recvmsg(msglen, socket.CMSG_LEN(maxfds * fds.itemsize))
    for cmsg_level, cmsg_type, cmsg_data in ancdata:
        if cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS:
            # Append data, ignoring any truncated integers at the end.
            fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
    return msg, list(fds)

バージョン3.3の新機能。

バージョン3.5で変更:システムコールが中断され、シグナルハンドラが例外を発生させない場合、メソッドは InterruptedError 例外を発生させる代わりに、システムコールを再試行するようになりました([X221Xを参照] ] PEP 475 (理論的根拠)。

socket.recvmsg_into(buffers[, ancbufsize[, flags]])

recvmsg()のように動作して、ソケットから通常のデータと補助データを受信しますが、新しいバイトオブジェクトを返す代わりに、非補助データを一連のバッファーに分散します。 buffers 引数は、書き込み可能なバッファーをエクスポートするオブジェクトの反復可能である必要があります(例: bytearray オブジェクト); これらは、すべてが書き込まれるか、バッファがなくなるまで、非補助データの連続するチャンクで埋められます。 オペレーティングシステムは、使用できるバッファの数に制限( sysconf()SC_IOV_MAX)を設定する場合があります。 ancbufsize および flags 引数は、 recvmsg()の場合と同じ意味を持ちます。

戻り値は4タプルです:(nbytes, ancdata, msg_flags, address)、ここで nbytes はバッファーに書き込まれた非補助データの合計バイト数、 ancdata 、[ X163X] msg_flags および address は、 recvmsg()の場合と同じです。

例:

>>> import socket
>>> s1, s2 = socket.socketpair()
>>> b1 = bytearray(b'----')
>>> b2 = bytearray(b'0123456789')
>>> b3 = bytearray(b'--------------')
>>> s1.send(b'Mary had a little lamb')
22
>>> s2.recvmsg_into([b1, memoryview(b2)[2:9], b3])
(22, [], 0, None)
>>> [b1, b2, b3]
[bytearray(b'Mary'), bytearray(b'01 had a 9'), bytearray(b'little lamb---')]

バージョン3.3の新機能。

socket.recvfrom_into(buffer[, nbytes[, flags]])
新しいバイト文字列を作成する代わりに、ソケットからデータを受信し、バッファに書き込みます。 戻り値はペア(nbytes, address)です。ここで、 nbytes は受信したバイト数であり、 address はデータを送信するソケットのアドレスです。 オプションの引数フラグの意味については、Unixのマニュアルページ recv(2)を参照してください。 デフォルトはゼロです。 (アドレスの形式はアドレスファミリによって異なります—上記を参照してください。)
socket.recv_into(buffer[, nbytes[, flags]])
ソケットから最大 nbytes バイトを受信し、新しいバイト文字列を作成するのではなく、データをバッファに格納します。 nbytes が指定されていない(または0)場合は、指定されたバッファーで使用可能なサイズまで受信します。 受信したバイト数を返します。 オプションの引数フラグの意味については、Unixのマニュアルページ recv(2)を参照してください。 デフォルトはゼロです。
socket.send(bytes[, flags])

ソケットにデータを送信します。 ソケットはリモートソケットに接続する必要があります。 オプションの flags 引数は、上記の recv()の場合と同じ意味です。 送信されたバイト数を返します。 アプリケーションは、すべてのデータが送信されたことを確認する責任があります。 一部のデータのみが送信された場合、アプリケーションは残りのデータの配信を試みる必要があります。 このトピックの詳細については、 Socket Programming HOWTO を参照してください。

バージョン3.5で変更:システムコールが中断され、シグナルハンドラが例外を発生させない場合、メソッドは InterruptedError 例外を発生させる代わりに、システムコールを再試行するようになりました([X221Xを参照] ] PEP 475 (理論的根拠)。

socket.sendall(bytes[, flags])

ソケットにデータを送信します。 ソケットはリモートソケットに接続する必要があります。 オプションの flags 引数は、上記の recv()の場合と同じ意味です。 send()とは異なり、このメソッドは、すべてのデータが送信されるかエラーが発生するまで、 bytes からデータを送信し続けます。 成功するとNoneが返されます。 エラーが発生すると、例外が発生し、正常に送信されたデータの量を判別する方法がありません。

バージョン3.5で変更:データが正常に送信されるたびにソケットタイムアウトがリセットされなくなりました。 ソケットタイムアウトは、すべてのデータを送信するための最大合計期間になりました。

バージョン3.5で変更:システムコールが中断され、シグナルハンドラが例外を発生させない場合、メソッドは InterruptedError 例外を発生させる代わりに、システムコールを再試行するようになりました([X221Xを参照] ] PEP 475 (理論的根拠)。

socket.sendto(bytes, address)
socket.sendto(bytes, flags, address)

ソケットにデータを送信します。 宛先ソケットはアドレスで指定されているため、ソケットをリモートソケットに接続しないでください。 オプションの flags 引数は、上記の recv()の場合と同じ意味です。 送信されたバイト数を返します。 (アドレスの形式はアドレスファミリによって異なります—上記を参照してください。)

バージョン3.5で変更:システムコールが中断され、シグナルハンドラが例外を発生させない場合、メソッドは InterruptedError 例外を発生させる代わりに、システムコールを再試行するようになりました([X221Xを参照] ] PEP 475 (理論的根拠)。

socket.sendmsg(buffers[, ancdata[, flags[, address]]])

通常の補助データをソケットに送信し、一連のバッファーから非補助データを収集して、単一のメッセージに連結します。 buffers 引数は、非補助データをバイトのようなオブジェクトの反復可能として指定します(例: bytes オブジェクト); オペレーティングシステムは、使用できるバッファの数に制限( sysconf()SC_IOV_MAX)を設定する場合があります。 ancdata 引数は、補助データ(制御メッセージ)を0個以上のタプル(cmsg_level, cmsg_type, cmsg_data)の反復可能として指定します。ここで、 cmsg_level および cmsg_type は整数です。プロトコルレベルとプロトコル固有のタイプをそれぞれ指定します。 cmsg_data は、関連データを保持するバイトのようなオブジェクトです。 一部のシステム(特に、 CMSG_SPACE()のないシステム)は、呼び出しごとに1つの制御メッセージのみの送信をサポートする場合があることに注意してください。 flags 引数のデフォルトは0で、 send()と同じ意味です。 Noneではなく address が指定されている場合、メッセージの宛先アドレスを設定します。 戻り値は、送信された非補助データのバイト数です。

次の関数は、SCM_RIGHTSメカニズムをサポートするシステムで、 AF_UNIX ソケットを介してファイル記述子 fds のリストを送信します。 recvmsg()も参照してください。

import socket, array

def send_fds(sock, msg, fds):
    return sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, array.array("i", fds))])

バージョン3.3の新機能。

バージョン3.5で変更:システムコールが中断され、シグナルハンドラが例外を発生させない場合、メソッドは InterruptedError 例外を発生させる代わりに、システムコールを再試行するようになりました([X221Xを参照] ] PEP 475 (理論的根拠)。

socket.sendmsg_afalg([msg, ]*, op[, iv[, assoclen[, flags]]])

AF_ALG ソケット用の sendmsg()の特殊バージョン。 AF_ALG ソケットのモード、IV、AEAD関連のデータ長とフラグを設定します。

バージョン3.6の新機能。

socket.sendfile(file, offset=0, count=None)

高性能 os.sendfile を使用してEOFに達するまでファイルを送信し、送信された合計バイト数を返します。 file は、バイナリモードで開かれる通常のファイルオブジェクトである必要があります。 os.sendfile が利用できない場合(例: Windows)またはファイルは通常のファイルではありません send()が代わりに使用されます。 offset は、ファイルの読み取りを開始する場所を示します。 指定した場合、 count は、EOFに達するまでファイルを送信するのではなく、送信する合計バイト数です。 ファイルの位置は、戻り時に更新されます。エラーが発生した場合は、 file.tell()を使用して、送信されたバイト数を把握できます。 ソケットは SOCK_STREAM タイプである必要があります。 非ブロッキングソケットはサポートされていません。

バージョン3.5の新機能。

socket.set_inheritable(inheritable)

ソケットのファイル記述子またはソケットのハンドルの継承可能フラグを設定します。

バージョン3.4の新機能。

socket.setblocking(flag)

ソケットのブロッキングモードまたは非ブロッキングモードを設定します。 flag がfalseの場合、ソケットは非ブロッキングに設定され、それ以外の場合はブロッキングモードに設定されます。

このメソッドは、特定の settimeout()呼び出しの省略形です。

  • sock.setblocking(True)sock.settimeout(None)と同等です

  • sock.setblocking(False)sock.settimeout(0.0)と同等です

バージョン3.7で変更:このメソッドは、 socket.typeSOCK_NONBLOCK フラグを適用しなくなりました。

socket.settimeout(value)

ソケット操作のブロックにタイムアウトを設定します。 value 引数は、秒を表す非負の浮動小数点数、またはNoneにすることができます。 ゼロ以外の値が指定された場合、操作が完了する前にタイムアウト期間 value が経過すると、後続のソケット操作で timeout 例外が発生します。 ゼロが指定された場合、ソケットは非ブロッキングモードになります。 Noneを指定すると、ソケットはブロッキングモードになります。

詳細については、ソケットタイムアウトに関する注記を参照してください。

バージョン3.7で変更:このメソッドは、 socket.typeSOCK_NONBLOCK フラグを切り替えなくなりました。

socket.setsockopt(level, optname, value: int)
socket.setsockopt(level, optname, value: buffer)
socket.setsockopt(level, optname, None, optlen: int)

指定されたソケットオプションの値を設定します(Unixのマニュアルページ setsockopt(2)を参照)。 必要なシンボリック定数は、 socket モジュール(SO_*など)で定義されています。 値は整数、None、またはバッファを表すバイトのようなオブジェクトにすることができます。 後者の場合、バイト文字列に適切なビットが含まれていることを確認するのは呼び出し元の責任です(C構造体をバイト文字列としてエンコードする方法については、オプションの組み込みモジュール struct を参照してください)。 valueNoneに設定されている場合、 optlen 引数が必要です。 これは、optval=NULLおよびoptlen=optlenを使用してsetsockopt() C関数を呼び出すのと同じです。

バージョン3.5で変更:書き込み可能なバイトのようなオブジェクトが受け入れられるようになりました。

バージョン3.6で変更: setsockopt(level、optname、None、optlen:int)フォームが追加されました。

socket.shutdown(how)
接続の一方または両方の半分をシャットダウンします。 howSHUT_RDの場合、それ以上の受信は許可されません。 howSHUT_WRの場合、それ以上の送信は許可されません。 howSHUT_RDWRの場合、それ以上の送受信は許可されません。
socket.share(process_id)

ソケットを複製し、ターゲットプロセスと共有できるように準備します。 ターゲットプロセスには、 process_id を指定する必要があります。 結果のbytesオブジェクトは、何らかの形式のプロセス間通信を使用してターゲットプロセスに渡すことができ、 fromshare()を使用してそこでソケットを再作成できます。 このメソッドが呼び出されると、オペレーティングシステムがすでにターゲットプロセス用にソケットを複製しているため、ソケットを閉じても安全です。

バージョン3.3の新機能。

read()またはwrite()のメソッドはないことに注意してください。 代わりに、 recv()および send()flags 引数なしで使用してください。

ソケットオブジェクトには、 socket コンストラクターに指定された値に対応するこれらの(読み取り専用)属性もあります。

socket.family
ソケットファミリ。
socket.type
ソケットタイプ。
socket.proto
ソケットプロトコル。


ソケットタイムアウトに関する注意

ソケットオブジェクトは、ブロッキング、非ブロッキング、またはタイムアウトの3つのモードのいずれかになります。 ソケットはデフォルトで常にブロッキングモードで作成されますが、これは setdefaulttimeout()を呼び出すことで変更できます。

  • ブロッキングモードでは、操作が完了するか、システムがエラー(接続のタイムアウトなど)を返すまで、操作がブロックされます。
  • 非ブロッキングモードでは、操作をすぐに完了できない場合、操作は失敗します(残念ながらシステムに依存するエラーが発生します)。選択の関数を使用して、いつ、どのように操作できるかを知ることができます。ソケットは読み取りまたは書き込みに使用できます。
  • タイムアウトモードでは、ソケットに指定されたタイムアウト内に操作を完了できない場合(タイムアウト例外が発生する)、またはシステムがエラーを返した場合、操作は失敗します。

ノート

オペレーティングシステムレベルでは、タイムアウトモードのソケットは内部的に非ブロッキングモードに設定されています。 また、ブロッキングモードとタイムアウトモードは、同じネットワークエンドポイントを参照するファイル記述子とソケットオブジェクト間で共有されます。 この実装の詳細は、たとえば次の場合に目に見える結果をもたらす可能性があります。 ソケットの fileno()を使用することにしました。


タイムアウトとconnectメソッド

connect()操作もタイムアウト設定の対象となります。通常、 connect()を呼び出す前に、 settimeout()を呼び出すか、 create_connection()へのタイムアウトパラメータ。 ただし、システムネットワークスタックは、Pythonソケットのタイムアウト設定に関係なく、独自の接続タイムアウトエラーを返す場合もあります。


タイムアウトとacceptメソッド

getdefaulttimeout()None でない場合、 accept()メソッドによって返されるソケットはそのタイムアウトを継承します。 それ以外の場合、動作はリスニングソケットの設定によって異なります。

  • リスニングソケットがブロッキングモードまたはタイムアウトモードの場合、 accept()によって返されるソケットはブロッキングモードです。
  • リスニングソケットが非ブロッキングモードの場合、 accept()によって返されるソケットがブロッキングモードであるか非ブロッキングモードであるかは、オペレーティングシステムによって異なります。 クロスプラットフォームの動作を保証したい場合は、この設定を手動でオーバーライドすることをお勧めします。


TCP / IPプロトコルを使用する4つの最小限のサンプルプログラムを次に示します。受信したすべてのデータをエコーバックするサーバー(1つのクライアントのみにサービスを提供)と、それを使用するクライアントです。 サーバーはシーケンス socket()bind()listen()accept()を実行する必要があることに注意してください(おそらく繰り返します accept()は複数のクライアントにサービスを提供します)が、クライアントはシーケンス socket()connect()のみを必要とします。 また、サーバーは、リッスンしているソケットではなく、 accept()によって返される新しいソケットで sendall() / recv()を実行しないことに注意してください。

最初の2つの例は、IPv4のみをサポートしています。

# Echo server program
import socket

HOST = ''                 # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data: break
            conn.sendall(data)
# Echo client program
import socket

HOST = 'daring.cwi.nl'    # The remote host
PORT = 50007              # The same port as used by the server
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(b'Hello, world')
    data = s.recv(1024)
print('Received', repr(data))

次の2つの例は、上記の2つの例と同じですが、IPv4とIPv6の両方をサポートしています。 サーバー側は、使用可能な最初のアドレスファミリをリッスンします(代わりに両方をリッスンする必要があります)。 ほとんどのIPv6対応システムでは、IPv6が優先され、サーバーはIPv4トラフィックを受け入れない場合があります。 クライアント側は、名前解決の結果として返されたすべてのアドレスに接続しようとし、正常に接続された最初のアドレスにトラフィックを送信します。

# Echo server program
import socket
import sys

HOST = None               # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
                              socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
    af, socktype, proto, canonname, sa = res
    try:
        s = socket.socket(af, socktype, proto)
    except OSError as msg:
        s = None
        continue
    try:
        s.bind(sa)
        s.listen(1)
    except OSError as msg:
        s.close()
        s = None
        continue
    break
if s is None:
    print('could not open socket')
    sys.exit(1)
conn, addr = s.accept()
with conn:
    print('Connected by', addr)
    while True:
        data = conn.recv(1024)
        if not data: break
        conn.send(data)
# Echo client program
import socket
import sys

HOST = 'daring.cwi.nl'    # The remote host
PORT = 50007              # The same port as used by the server
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):
    af, socktype, proto, canonname, sa = res
    try:
        s = socket.socket(af, socktype, proto)
    except OSError as msg:
        s = None
        continue
    try:
        s.connect(sa)
    except OSError as msg:
        s.close()
        s = None
        continue
    break
if s is None:
    print('could not open socket')
    sys.exit(1)
with s:
    s.sendall(b'Hello, world')
    data = s.recv(1024)
print('Received', repr(data))

次の例は、Windowsでrawソケットを使用して非常に単純なネットワークスニファを作成する方法を示しています。 この例では、インターフェイスを変更するために管理者権限が必要です。

import socket

# the public network interface
HOST = socket.gethostbyname(socket.gethostname())

# create a raw socket and bind it to the public interface
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
s.bind((HOST, 0))

# Include IP headers
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

# receive all packages
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

# receive a package
print(s.recvfrom(65565))

# disabled promiscuous mode
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)

次の例は、ソケットインターフェイスを使用してrawソケットプロトコルを使用してCANネットワークと通信する方法を示しています。 代わりにブロードキャストマネージャプロトコルでCANを使用するには、次のコマンドでソケットを開きます。

socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)

ソケットをバインド(CAN_RAW)または接続( CAN_BCM )した後、 socket.send()および socket.recv()を使用できます。 通常どおりソケットオブジェクトに対する操作(および対応するもの)。

この最後の例では、特別な特権が必要になる場合があります。

import socket
import struct


# CAN frame packing/unpacking (see 'struct can_frame' in <linux/can.h>)

can_frame_fmt = "=IB3x8s"
can_frame_size = struct.calcsize(can_frame_fmt)

def build_can_frame(can_id, data):
    can_dlc = len(data)
    data = data.ljust(8, b'\x00')
    return struct.pack(can_frame_fmt, can_id, can_dlc, data)

def dissect_can_frame(frame):
    can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)
    return (can_id, can_dlc, data[:can_dlc])


# create a raw socket and bind it to the 'vcan0' interface
s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
s.bind(('vcan0',))

while True:
    cf, addr = s.recvfrom(can_frame_size)

    print('Received: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf))

    try:
        s.send(cf)
    except OSError:
        print('Error sending CAN frame')

    try:
        s.send(build_can_frame(0x01, b'\x01\x02\x03'))
    except OSError:
        print('Error sending CAN frame')

実行間の遅延が小さすぎる例を数回実行すると、次のエラーが発生する可能性があります。

OSError: [Errno 98] Address already in use

これは、前回の実行でソケットがTIME_WAIT状態のままになり、すぐに再利用できないためです。

これを防ぐために、 socket フラグを設定する必要があります。socket.SO_REUSEADDR

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))

SO_REUSEADDRフラグは、自然なタイムアウトが期限切れになるのを待たずに、TIME_WAIT状態のローカルソケットを再利用するようにカーネルに指示します。

も参照してください

ソケットプログラミングの概要(C)については、次の論文を参照してください。

  • StuartSechrestによる4.3BSDプロセス間通信入門チュートリアル
  • SamuelJによる高度な4.3BSDプロセス間通信チュートリアル。 レフラーら、

UNIXプログラマーマニュアルの補足文書1(セクションPS1:7およびPS1:8)の両方。 さまざまなソケット関連のシステムコールに関するプラットフォーム固有のリファレンス資料も、ソケットセマンティクスの詳細に関する貴重な情報源です。 Unixについては、マニュアルページを参照してください。 Windowsの場合は、WinSock(またはWinsock 2)の仕様を参照してください。 IPv6対応APIの場合、読者は RFC 3493 というタイトルのIPv6の基本的なソケットインターフェイス拡張機能を参照することをお勧めします。