socket --- 低水準ネットワークインターフェース¶
ソースコード: Lib/socket.py
このモジュールはBSDの ソケット(socket) インターフェイスへのアクセスを提供します。これは、近代的なUnixシステム、Windows、MacOS、その他多くのプラットフォームで動作します。
注釈
いくつかの挙動はプラットフォームに依存します。オペレーティングシステムのソケットAPIを呼び出しているためです。
利用可能な環境: not WASI.
このモジュールは WebAssembly では動作しないか、利用不可です。詳しくは、WebAssembly プラットフォーム を見てください。
Pythonインターフェースは、Unixのソケット用システムコールとライブラリインターフェースを、そのままPythonのオブジェクト指向スタイルに変換したものです。各種ソケット関連のシステムコールは、 socket() 関数で生成される socket オブジェクト のメソッドとして実装されています。 メソッドの引数は C のインターフェイスよりも多少高水準で、例えばファイルに対する read() や write() メソッドと同様に、 受信時のバッファ確保は自動的に処理され、送信時のバッファ長は暗黙的に決まります。
参考
- Module
socketserver ネットワークサーバの開発を省力化するためのクラス群。
- Module
ssl ソケットオブジェクトに対する TLS/SSL ラッパー.
ソケットファミリー¶
どのシステムで実行するかとビルドオプションに依存しますが、このモジュールによって多様なソケットファミリーをサポートします。
特定のソケットオブジェクトによって必要とされるアドレスフォーマットは、ソケットオブジェクトが生成されたときに指定されたアドレスファミリーを元に自動的に選択されます。ソケットアドレスは次の通りです。
ファイルシステム上のノードに束縛された
AF_UNIXソケットのアドレスは、ファイルシステムエンコーディングと'surrogateescape'エラーハンドラ (PEP 383 を参照) を使って文字列として表現されます。 Linux の抽象名前空間のアドレスは、先頭が null バイトとなる bytes-like object として返されます。この名前空間のソケットは通常のファイルシステム上のソケットと通信できるので、 Linux 上で動作することを意図したプログラムは両方のアドレスを扱う必要がある可能性があります。文字列と bytes-like オブジェクトはどちらのタイプのアドレスにも引数として渡すことができます。バージョン 3.3 で変更: これまでは
AF_UNIXソケットパスは UTF-8 エンコーディングを使用するものとされていました。バージョン 3.5 で変更: 書き込み可能な bytes-like object を使用できるようになりました。
AF_INETアドレスファミリーには、(host, port)のペアを使います。 host は、'daring.cwi.nl'のようなインターネットのドメイン表記のホスト名、または'100.50.200.5'のような IPv4 アドレスを表す文字列です。 port は整数です。IPv4ではホストアドレスのほかに2つの特別な形式が使用できます。
''はすべてのインターフェイスにバインドされるために使われるINADDR_ANYを表し、'<broadcast>'はINADDR_BROADCASTを表します。これらの動作はIPv6と互換性がありません。そのためもしもあなたがPythonプログラムでIPv6をサポートする予定があるのならばこれらを避けたほうが良いでしょう。
AF_INET6アドレスファミリーでは、四要素のタプル(host, port, flowinfo, scope_id)を使います。 flowinfo と scope_id は、C のstruct sockaddr_in6のsin6_flowinfoとsin6_scope_idメンバーを表します。socketモジュールのメソッドでは、後方互換性のために flowinfo と scope_id を省略できます。 ただし、scope_id を省略すると、スコープ付き IPv6 アドレスの操作で問題が生じる場合があります。バージョン 3.7 で変更: マルチキャストアドレス (scope_id に意味がある場合) では、address に
%scope_id(またはzone id) の部分を含めなくても構いません。 この情報は冗長なので、安全に省略できます (省略を推奨します)。AF_NETLINKソケットのアドレスは(pid, groups)のペアで表されます。Linux 限定で、
AF_TIPCアドレスファミリーを用いて TIPC がサポートされます。 TIPC は、クラスタコンピューティング環境のために設計された、IP ベースではないオープンなネットワークプロトコルです。アドレスはタプルで表現され、フィールドはアドレスタイプに依存します。一般的なタプルの形式は(addr_type, v1, v2, v3 [, scope])で、それぞれは次の通りです:addr_type は
TIPC_ADDR_NAMESEQ,TIPC_ADDR_NAME,TIPC_ADDR_IDの1つ。scope は
TIPC_ZONE_SCOPE,TIPC_CLUSTER_SCOPE,TIPC_NODE_SCOPEの1つ。addr_type が
TIPC_ADDR_NAMEの場合、 v1 はサーバータイプ、 v2 はポートID (the port identifier)、そして v3 は 0 であるべきです。addr_type が
TIPC_ADDR_NAMESEQの場合、 v1 はサーバータイプ、 v2 はポート番号の下限、 v3 はポート番号の上限 です。addr_type が
TIPC_ADDR_IDの場合、 v1 はノード、 v2 は参照、 v3 は0であるべきです。
AF_CANアドレスファミリーには(interface, )というタプルを利用します。 interface は'can0'のようなネットワークインターフェース名を表す文字列です。このファミリーの全てのネットワークインターフェースからパケットを受信するために、ネットワークインターフェース名''を利用できます。文字列またはタプル
(id, unit)はPF_SYSTEMファミリーのSYSPROTO_CONTROLプロトコルのために使用されます。この文字列は、動的に割り当てられたIDによるカーネルコントロールの名前です。このタプルは、カーネルコントロールのIDとユニット番号が既知の場合、または登録済みIDが使用中の場合に使用することができます。Added in version 3.3.
AF_BLUETOOTHは以下のプロトコルとアドレスフォーマットをサポートしています。BTPROTO_L2CAPはタプル(bdaddr, psm[, cid[, bdaddr_type]])を受け取り、各要素は次の意味です。bdaddrは Bluetooth アドレスを指定する文字列です。psmは Protocol/Service Multiplexer を指定する整数です。cidは Channel Identifier を指定する、省略可能な整数です。 省略した場合はゼロです。bdaddr_typeはアドレスの種類を指定する、省略可能な整数です。BDADDR_BREDR(デフォルト)、BDADDR_LE_PUBLIC、BDADDR_LE_RANDOMのいずれかです。
バージョン 3.14 で変更:
cidとbdaddr_typeフィールドが追加されました。BTPROTO_RFCOMMは(bdaddr, channel)を受け取ります。bdaddrは Bluetooth アドレスを表す文字列で、channelは整数です。BTPROTO_HCIが受け取る形式は OS によって異なります。Linux では、整数
device_idまたはタプル(device_id, [channel])を受け取ります。device_idは Bluetooth デバイスの番号、channelは HCI チャネルを指定する省略可能な整数です (デフォルトはHCI_CHANNEL_RAW)。FreeBSD、NetBSD、DragonFly BSD では、Bluetooth アドレスを表す文字列
bdaddrを受け取ります。
バージョン 3.2 で変更: NetBSD と DragonFlyBSD のサポートが追加されました。
バージョン 3.13.3 で変更: FreeBSD のサポートが追加されました。
バージョン 3.14 で変更:
channelフィールドが追加されました。 タプルに格納されていないdevice_idも受け取れるようになりました。BTPROTO_SCOは、Bluetooth アドレスを表す文字列またはbytesオブジェクトbdaddrを受け取ります (例えば'12:23:34:45:56:67'やb'12:23:34:45:56:67')。バージョン 3.14 で変更: FreeBSD のサポートが追加されました。
AF_ALGはカーネル暗号へのソケットベースのインターフェイスで、Linux でのみ使用できます。アルゴリズムソケットは、2 つから 4 つの要素を持つタプル(type, name [, feat [, mask]])で構成されます。各要素の意味は、以下の通りです。type はアルゴリズムタイプを示す文字列です。例:
aead,hash,skcipherまたはrng。name はアルゴリズム名及び操作モードを示す文字列です。例:
sha256,hmac(sha256),cbc(aes)またはdrbg_nopr_ctr_aes256。feat と mask は、符号を持たない 32 ビットの整数です。
利用可能な環境: Linux >= 2.6.38.
一部のアルゴリズムタイプでは、さらに新しいカーネルが必要です。
Added in version 3.6.
AF_VSOCKは、仮想マシンとそのホストとの通信を可能にします。 ソケットは(CID, port)タプルで表し、コンテキスト ID (CID) とポートは整数です。Added in version 3.7.
AF_PACKETは、ネットワークデバイスへ直接アクセスする低水準インターフェースです。 アドレスはタプル(ifname, proto[, pkttype[, hatype[, addr]]])で表し、各要素は次の意味です。ifname - デバイス名を指定する文字列。
proto - Ethernet プロトコル番号です。 すべてのプロトコルを取得する
ETH_P_ALL、ETHERTYPE_* 定数 のいずれか、またはその他の Ethernet プロトコル番号を指定できます。pkttype - パケットタイプを指定するオプションの整数:
PACKET_HOST(デフォルト) - ローカルホスト宛てのパケット。PACKET_BROADCAST- 物理層のブロードキャストパケット。PACKET_MULTICAST- 物理層のマルチキャストアドレスに送信されたパケット。PACKET_OTHERHOST- プロミスキャスモードのデバイスドライバーが取得した、別のホスト宛てのパケット。PACKET_OUTGOING- ローカルホストから送信され、パケットソケットにループバックされたパケット。
hatype - ARP ハードウェアアドレスの種類を指定する、省略可能な整数です。
addr - ハードウェアの物理アドレスを指定する、省略可能な バイト列類似オブジェクトです。 その解釈はデバイスによって異なります。
利用可能な環境: Linux >= 2.2.
AF_QIPCRTRは、Qualcomm プラットフォームのコプロセッサー上で動作するサービスと通信するための、Linux 限定のソケットベースのインターフェースです。 アドレスファミリーは(node, port)タプルで表し、node と port は非負の整数です。利用可能な環境: Linux >= 4.7.
Added in version 3.8.
IPPROTO_UDPLITEis a variant of UDP which allows you to specify what portion of a packet is covered with the checksum. It adds two socket options that you can change.self.setsockopt(IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV, length)will change what portion of outgoing packets are covered by the checksum andself.setsockopt(IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV, length)will filter out packets which cover too little of their data. In both caseslengthshould be inrange(8, 2**16, 8).IPv4 では
socket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE)、IPv6 ではsocket(AF_INET6, SOCK_DGRAM, IPPROTO_UDPLITE)で、このソケットを作成します。利用可能な環境: Linux >= 2.6.20, FreeBSD >= 10.1
Added in version 3.9.
AF_HYPERVは、Hyper-V のホストとゲストが通信するための、Windows 限定のソケットベースのインターフェースです。 アドレスファミリーは(vm_id, service_id)タプルで表し、vm_idとservice_idは UUID 文字列です。vm_idは仮想マシンの識別子です。 対象が特定の仮想マシンでない場合は、あらかじめ定義された VMID 値のいずれかを使います。socketで定義されている VMID 定数は次のとおりです。HV_GUID_ZEROHV_GUID_BROADCASTHV_GUID_WILDCARD- 自身にバインドし、すべてのパーティションからの接続を受け付けるために使います。HV_GUID_CHILDREN- 自身にバインドし、子パーティションからの接続を受け付けるために使います。HV_GUID_LOOPBACK- 自身を接続先として指定するために使います。HV_GUID_PARENT- バインド先として使うと、親パーティションからの接続を受け付けます。 接続先アドレスとして使うと、親パーティションへ接続します。
service_idは登録されたサービスのサービス識別子です。Added in version 3.12.
IPv4/v6ソケットの host 部にホスト名を指定すると、処理結果が一定ではない場合があります。これはPythonはDNSから取得したアドレスのうち最初のアドレスを使用するので、 DNSの処理やホストの設定によって異なるIPv4/6アドレスを取得する場合があるためです。常に同じ結果が必要であれば、 host に数値のアドレスを指定してください。
エラー時には例外が発生します。引数型のエラーやメモリ不足の場合には通常の例外が発生し、ソケットやアドレス関連のエラーの場合は OSError またはそのサブクラスが発生します。
setblocking() メソッドで、非ブロッキングモードを使用することができます。また、より汎用的に settimeout() メソッドでタイムアウトを指定する事ができます。
モジュールの内容¶
socket モジュールは以下の要素を公開しています。
例外¶
- exception socket.herror¶
OSErrorのサブクラス。この例外はアドレス関連のエラー、つまりgethostbyname_ex()とgethostbyaddr()などの、 POSIX C API の h_errno を利用する関数のために利用されます。例外に付随する(h_errno, string)ペアはライブラリの呼び出しによって返されたエラーを表します。 h_errno は数値で、 string は、hstrerror()C関数によって返される h_errno を説明する文字列です。バージョン 3.3 で変更: このクラスは
OSErrorのサブクラスになりました。
- exception socket.gaierror¶
OSErrorのサブクラスで、getaddrinfo()とgetnameinfo()がアドレス関連のエラーで送出します。 付随する値は、ライブラリ呼び出しが返したエラーを表す(error, string)のペアです。 string は C 関数gai_strerror()が返す error の説明です。 数値 error は、このモジュールで定義されたEAI_*定数のいずれかに一致します。バージョン 3.3 で変更: このクラスは
OSErrorのサブクラスになりました。
- exception socket.timeout¶
TimeoutErrorの非推奨のエイリアスです。OSErrorのサブクラスです。この例外は、あらかじめsettimeout()を呼び出して (あるいはsetdefaulttimeout()を利用して暗黙に) タイムアウトを有効にしてあるソケットでタイムアウトが生じた際に送出されます。 例外に付属する値は文字列で、その内容は現状では常に "timed out" となります。バージョン 3.3 で変更: このクラスは
OSErrorのサブクラスになりました。バージョン 3.10 で変更: このクラスは
TimeoutErrorのエイリアスになりました。
定数¶
AF_* 定数と SOCK_* 定数は、 AddressFamily と SocketKind IntEnum collection になりました。
Added in version 3.4.
- socket.AF_UNIX¶
- socket.AF_INET¶
- socket.AF_INET6¶
これらの定数はアドレスファミリー (およびプロトコルファミリー) を表し、
socket()の最初の引数に使います。AF_UNIX定数が定義されていない場合、このプロトコルはサポートされていません。 システムによっては、ほかの定数も利用できます。
- socket.AF_UNSPEC¶
AF_UNSPECは、利用可能なアドレスファミリー (IPv4、IPv6、その他) を問わずgetaddrinfo()がソケットアドレスを返すことを指定します。
- socket.SOCK_STREAM¶
- socket.SOCK_DGRAM¶
- socket.SOCK_RAW¶
- socket.SOCK_RDM¶
- socket.SOCK_SEQPACKET¶
これらの定数はソケットの種類を表し、
socket()の 2 番目の引数に使います。 システムによっては、ほかの定数も利用できます。 (一般に役立つのはSOCK_STREAMとSOCK_DGRAMだけのようです。)
- socket.SOCK_CLOEXEC¶
- socket.SOCK_NONBLOCK¶
この2つの定数が定義されていた場合、ソケットタイプと組み合わせていくつかの flags をアトミックに設定することができます (別の呼び出しを不要にして競合状態を避ける事ができます)。
参考
より完全な説明は Secure File Descriptor Handling を参照してください。
利用可能な環境: Linux >= 2.6.27.
Added in version 3.2.
- SO_*
- socket.SOMAXCONN¶
- MSG_*
- SOL_*
- SCM_*
- IPPROTO_*
- IPPORT_*
- INADDR_*
- IP_*
- IPV6_*
- EAI_*
- AI_*
- NI_*
- TCP_*
Unix のソケットや IP プロトコルのドキュメントで説明されている、この形式の定数の多くも socket モジュールで定義されています。 通常、ソケットオブジェクトの
setsockopt()メソッドとgetsockopt()メソッドの引数に使います。 ほとんどの場合、Unix のヘッダーファイルで定義されているシンボルだけが定義されますが、いくつかのシンボルにはデフォルト値が用意されています。バージョン 3.6 で変更:
SO_DOMAIN,SO_PROTOCOL,SO_PEERSEC,SO_PASSSEC,TCP_USER_TIMEOUT,TCP_CONGESTIONが追加されました。バージョン 3.6.5 で変更: Windows プラットフォームで、利用可能な場合に
TCP_FASTOPENとTCP_KEEPCNTをサポートするようになりました。バージョン 3.7 で変更:
TCP_NOTSENT_LOWATが追加されました。Windows プラットフォームで、利用可能な場合に
TCP_KEEPIDLEとTCP_KEEPINTVLをサポートするようになりました。バージョン 3.10 で変更:
IP_RECVTOSが追加されました。TCP_KEEPALIVEが追加されました。 macOS では、Linux のTCP_KEEPIDLEと同じようにこの定数を使えます。バージョン 3.11 で変更:
TCP_CONNECTION_INFOが追加されました。 macOS では、Linux や BSD のTCP_INFOと同じようにこの定数を使えます。バージョン 3.12 で変更:
SO_RTABLEとSO_USER_COOKIEが追加されました。 それぞれ OpenBSD と FreeBSD で、Linux のSO_MARKと同じように使えます。 また、欠けていた Linux の TCP ソケットオプションが追加されました:TCP_MD5SIG、TCP_THIN_LINEAR_TIMEOUTS、TCP_THIN_DUPACK、TCP_REPAIR、TCP_REPAIR_QUEUE、TCP_QUEUE_SEQ、TCP_REPAIR_OPTIONS、TCP_TIMESTAMP、TCP_CC_INFO、TCP_SAVE_SYN、TCP_SAVED_SYN、TCP_REPAIR_WINDOW、TCP_FASTOPEN_CONNECT、TCP_ULP、TCP_MD5SIG_EXT、TCP_FASTOPEN_KEY、TCP_FASTOPEN_NO_COOKIE、TCP_ZEROCOPY_RECEIVE、TCP_INQ、TCP_TX_DELAY。IP_PKTINFO、IP_UNBLOCK_SOURCE、IP_BLOCK_SOURCE、IP_ADD_SOURCE_MEMBERSHIP、IP_DROP_SOURCE_MEMBERSHIPが追加されました。バージョン 3.13 で変更:
SO_BINDTOIFINDEXが追加されました。 Linux ではSO_BINDTODEVICEと同じように使えますが、ネットワークインターフェースの名前の代わりにインデックスを指定します。バージョン 3.14 で変更: Linux で欠けていた
IP_FREEBIND、IP_RECVERR、IPV6_RECVERR、IP_RECVTTL、IP_RECVORIGDSTADDRが追加されました。バージョン 3.14 で変更: Windows プラットフォームで、利用可能な場合に
TCP_QUICKACKをサポートするようになりました。バージョン 3.15 で変更:
IPV6_HDRINCLが追加されました。 Linux プラットフォームで、利用可能な場合にSO_PASSRIGHTSをサポートするようになりました。
- socket.AF_CAN¶
- socket.PF_CAN¶
- SOL_CAN_*
- CAN_*
Linux ドキュメントにあるこの形式の定数は socket モジュールでも定義されています。
利用可能な環境: Linux >= 2.6.25, NetBSD >= 8.
Added in version 3.3.
バージョン 3.11 で変更: NetBSD サポートが追加されました。
バージョン 3.14 で変更: Linux で欠けていた
CAN_RAW_ERR_FILTERが復元されました。
- socket.CAN_BCM¶
- CAN_BCM_*
CANプロトコルファミリーのCAN_BCMは、ブロードキャストマネージャー(BCM)プロトコルです。Linuxドキュメントにあるこの形式の定数は、socketモジュールでも定義されています。
利用可能な環境: Linux >= 2.6.25.
注釈
CAN_BCM_CAN_FD_FRAMEフラグは Linux 4.8 以降でのみ利用できます。Added in version 3.4.
- socket.CAN_RAW_FD_FRAMES¶
CAN_RAW ソケットで CAN FD をサポートします。これはデフォルトで無効になっています。これにより、アプリケーションが CAN フレームと CAN FD フレームを送信できるようになります。ただし、ソケットからの読み出し時に、CAN と CAN FD の両方のフレームを受け入れなければなりません。
この定数は、 Linux のドキュメンテーションで説明されています。
利用可能な環境: Linux >= 3.6.
Added in version 3.5.
- socket.CAN_RAW_JOIN_FILTERS¶
適用される CAN フィルターを結合し、指定されたすべての CAN フィルターに一致する CAN フレームだけをユーザー空間に渡します。
この定数は、 Linux のドキュメンテーションで説明されています。
利用可能な環境: Linux >= 4.1.
Added in version 3.9.
- socket.CAN_ISOTP¶
CAN プロトコルファミリーの CAN_ISOTP は ISO-TP (ISO 15765-2) プロトコルです。 ISO-TP の定数は Linux のドキュメントで説明されています。
利用可能な環境: Linux >= 2.6.25.
Added in version 3.7.
- socket.CAN_J1939¶
CAN プロトコルファミリーの CAN_J1939 は SAE J1939 プロトコルです。 J1939 の定数は Linux のドキュメントで説明されています。
利用可能な環境: Linux >= 5.4.
Added in version 3.9.
- socket.AF_DIVERT¶
- socket.PF_DIVERT¶
FreeBSD の divert(4) マニュアルページで説明されているこの 2 つの定数も、socket モジュールで定義されています。
利用可能な環境: FreeBSD >= 14.0.
Added in version 3.12.
- socket.AF_PACKET¶
- socket.PF_PACKET¶
- PACKET_*
Linux ドキュメントにあるこの形式の定数は socket モジュールでも定義されています。
利用可能な環境: Linux >= 2.2.
- socket.ETH_P_ALL¶
AF_PACKETファミリーのsocketコンストラクターの proto にETH_P_ALLを使うと、プロトコルを問わずすべてのパケットを取得できます。詳しくは packet(7) マニュアルページを参照してください。
利用可能な環境: Linux.
Added in version 3.12.
- socket.AF_RDS¶
- socket.PF_RDS¶
- socket.SOL_RDS¶
- RDS_*
Linux ドキュメントにあるこの形式の定数は socket モジュールでも定義されています。
利用可能な環境: Linux >= 2.6.30.
Added in version 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_*
TIPC 関連の定数で、C のソケットAPIが公開しているものにマッチします。詳しい情報は TIPC のドキュメントを参照してください。
- socket.AF_ALG¶
- socket.SOL_ALG¶
- ALG_*
Linux カーネル暗号用の定数です。
利用可能な環境: Linux >= 2.6.38.
Added in version 3.6.
- socket.AF_VSOCK¶
- socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID¶
- VMADDR*
- SO_VM*
Linux のホストとゲスト間の通信用の定数です。
利用可能な環境: Linux >= 4.8.
Added in version 3.7.
- socket.has_ipv6¶
現在のプラットフォームでIPv6がサポートされているか否かを示す真偽値。
- socket.AF_BLUETOOTH¶
- socket.BTPROTO_L2CAP¶
- socket.BTPROTO_RFCOMM¶
- socket.BTPROTO_HCI¶
- socket.BTPROTO_SCO¶
Bluetooth アドレスに使う整数定数です。
- socket.BDADDR_ANY¶
- socket.BDADDR_LOCAL¶
これらは、特別な意味を持つ Bluetooth アドレスを含む文字列定数です。例えば、
BDADDR_ANYを使用すると、BTPROTO_RFCOMMで束縛ソケットを指定する際に、任意のアドレスを指し示すことができます。
- socket.BDADDR_BREDR¶
- socket.BDADDR_LE_PUBLIC¶
- socket.BDADDR_LE_RANDOM¶
これらの定数は、
BTPROTO_L2CAPソケットのバインドや接続に使う Bluetooth アドレスの種類を表します。利用可能な環境: Linux, FreeBSD
Added in version 3.14.
- socket.SOL_RFCOMM¶
- socket.SOL_L2CAP¶
- socket.SOL_HCI¶
- socket.SOL_SCO¶
- socket.SOL_BLUETOOTH¶
Bluetooth ソケットオブジェクトの
setsockopt()メソッドとgetsockopt()メソッドのlevel引数に使います。SOL_BLUETOOTHは Linux でのみ利用できます。 ほかの定数は、対応するプロトコルがサポートされている場合に利用できます。
- SO_L2CAP_*
- socket.L2CAP_LM¶
- L2CAP_LM_*
- SO_RFCOMM_*
- RFCOMM_LM_*
- SO_SCO_*
- SO_BTH_*
- BT_*
Bluetooth ソケットオブジェクトの
setsockopt()メソッドとgetsockopt()メソッドで、オプション名や値を指定する引数に使います。BT_*とL2CAP_LMは Linux でのみ利用できます。SO_BTH_*は Windows でのみ利用できます。 ほかの定数は Linux や各種 BSD プラットフォームで利用できる場合があります。Added in version 3.14.
- socket.HCI_FILTER¶
- socket.HCI_TIME_STAMP¶
- socket.HCI_DATA_DIR¶
- socket.SO_HCI_EVT_FILTER¶
- socket.SO_HCI_PKT_FILTER¶
BTPROTO_HCIに使うオプション名です。 利用できるオプションとその値の形式はプラットフォームによって異なります。バージョン 3.14 で変更: NetBSD と DragonFly BSD に
SO_HCI_EVT_FILTERとSO_HCI_PKT_FILTERが追加されました。 FreeBSD、NetBSD、DragonFly BSD にHCI_DATA_DIRが追加されました。
- socket.HCI_DEV_NONE¶
単一の Bluetooth アダプターに限定されない HCI ソケットを作成するための
device_idの値です。利用可能な環境: Linux
Added in version 3.14.
- socket.HCI_CHANNEL_RAW¶
- socket.HCI_CHANNEL_USER¶
- socket.HCI_CHANNEL_MONITOR¶
- socket.HCI_CHANNEL_CONTROL¶
- socket.HCI_CHANNEL_LOGGING¶
BTPROTO_HCIアドレスのchannelフィールドに指定できる値です。利用可能な環境: Linux
Added in version 3.14.
- socket.SCM_CREDS2¶
- socket.LOCAL_CREDS¶
- socket.LOCAL_CREDS_PERSISTENT¶
LOCAL_CREDS と LOCAL_CREDS_PERSISTENT は SOCK_DGRAM ソケットと SOCK_STREAM ソケットで使え、Linux や DragonFlyBSD の SO_PASSCRED に相当します。 LOCAL_CREDS は最初の読み取り時に認証情報を送信し、LOCAL_CREDS_PERSISTENT は読み取りのたびに送信します。 後者ではメッセージの種類に SCM_CREDS2 を使う必要があります。
Added in version 3.11.
利用可能な環境: FreeBSD.
- socket.SO_INCOMING_CPU¶
CPU の局所性を最適化するための定数で、
SO_REUSEPORTと組み合わせて使います。Added in version 3.11.
利用可能な環境: Linux >= 3.9
- socket.SO_REUSEPORT_LB¶
同じアドレスとポートへの複数のバインドと負荷分散を有効にする定数です。
Added in version 3.14.
利用可能な環境: FreeBSD >= 12.0
- socket.AF_HYPERV¶
- socket.HV_PROTOCOL_RAW¶
- socket.HVSOCKET_CONNECT_TIMEOUT¶
- socket.HVSOCKET_CONNECT_TIMEOUT_MAX¶
- socket.HVSOCKET_CONNECTED_SUSPEND¶
- socket.HVSOCKET_ADDRESS_FLAG_PASSTHRU¶
- socket.HV_GUID_ZERO¶
- socket.HV_GUID_WILDCARD¶
- socket.HV_GUID_BROADCAST¶
- socket.HV_GUID_CHILDREN¶
- socket.HV_GUID_LOOPBACK¶
- socket.HV_GUID_PARENT¶
ホストとゲスト間の通信に使う Windows Hyper-V ソケットの定数です。
利用可能な環境: Windows.
Added in version 3.12.
- socket.ETHERTYPE_ARP¶
- socket.ETHERTYPE_IP¶
- socket.ETHERTYPE_IPV6¶
- socket.ETHERTYPE_VLAN¶
IEEE 802.3 プロトコル番号 の定数です。
利用可能な環境: Linux, FreeBSD, macOS.
Added in version 3.12.
- socket.SHUT_RD¶
- socket.SHUT_WR¶
- socket.SHUT_RDWR¶
これらの定数はソケットオブジェクトの
shutdown()メソッドで使います。利用可能な環境: not WASI.
関数¶
ソケットの作成¶
以下の関数は全て socket object を生成します。
socket クラスのコンストラクターは、新しいソケットを直接作成します。
引数と詳しい説明は socket オブジェクト を参照してください。
- socket.socketpair([family[, type[, proto]]])¶
指定されたアドレスファミリー、ソケットの種類、プロトコル番号で、互いに接続されたソケットオブジェクトのペアを作成します。 アドレスファミリー、ソケットの種類、プロトコル番号は
socket()関数と同じです。 デフォルトのアドレスファミリーは、そのプラットフォームで定義されていればAF_UNIX、そうでなければAF_INETです。新たに作成されたソケットは 継承不可 です。
バージョン 3.2 で変更: 返されるソケットオブジェクトが、サブセットではなく完全なソケットAPIを提供するようになりました。
バージョン 3.4 で変更: 返されるソケットの組は、どちらも継承不可になりました。
バージョン 3.5 で変更: Windows のサポートが追加されました。
- socket.create_connection(address, timeout=GLOBAL_DEFAULT, source_address=None, *, all_errors=False)¶
インターネット address (
(host, port)ペア) で listen しているTCPサービスに接続し、ソケットオブジェクトを返します。これはsocket.connect()を高級にした関数です。 host が数値でないホスト名の場合、AF_INETとAF_INET6の両方で名前解決を試み、得られた全てのアドレスに対して成功するまで接続を試みます。この関数を使って IPv4 と IPv6 に両対応したクライアントを簡単に書くことができます。オプションの timeout 引数を指定すると、接続を試みる前にソケットオブジェクトのタイムアウトを設定します。 timeout が指定されない場合、
getdefaulttimeout()が返すデフォルトのタイムアウト設定値を利用します。source_address は接続する前にバインドするソースアドレスを指定するオプション引数で、指定する場合は
(host, port)の2要素タプルでなければなりません。 host や port が '' か 0 だった場合は、OSのデフォルトの動作になります。接続を確立できない場合は例外を送出します。 デフォルトでは、リスト内の最後のアドレスで発生した例外を送出します。 all_errors が
Trueの場合は、すべての接続試行のエラーを含むExceptionGroupを送出します。バージョン 3.2 で変更: source_address が追加されました。
バージョン 3.11 で変更: all_errors が追加されました
- socket.create_server(address, *, family=AF_INET, backlog=None, reuse_port=False, dualstack_ipv6=False)¶
address (
(host, port)という 2 要素のタプル) にバインドされた TCP ソケットを作成し、そのソケットオブジェクトを返す便利な関数です。family は
AF_INETまたはAF_INET6でなければなりません。 backlog はsocket.listen()に渡すキューのサイズです。 指定しない場合は、適切なデフォルト値が選ばれます。 reuse_port はソケットオプションSO_REUSEPORTを設定するかどうかを指定します。dualstack_ipv6 が真の場合、family が
AF_INET6でプラットフォームがこの機能をサポートしていれば、ソケットは IPv4 と IPv6 の両方の接続を受け入れられます。 そうでなければValueErrorを送出します。 ほとんどの POSIX プラットフォームと Windows はこの機能をサポートしているはずです。 この機能が有効な場合、IPv4 接続に対してsocket.getpeername()が返すアドレスは、IPv4 射影 IPv6 アドレスとして表された IPv6 アドレスになります。 dualstack_ipv6 が偽の場合、この機能をデフォルトで有効にするプラットフォーム (Linux など) でも明示的に無効にします。 この引数はhas_dualstack_ipv6()と組み合わせて使えます:import socket addr = ("", 8080) # すべてのインターフェース、ポート 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 プラットフォームでは、同じ address にバインドされて TIME_WAIT 状態で残っている以前のソケットをすぐに再利用できるよう、ソケットオプション
SO_REUSEADDRを設定します。Added in version 3.8.
- socket.has_dualstack_ipv6()¶
プラットフォームが IPv4 と IPv6 の両方の接続を扱える TCP ソケットの作成をサポートしていれば、
Trueを返します。Added in version 3.8.
- socket.fromfd(fd, family, type, proto=0)¶
ファイル記述子 fd (ファイルオブジェクトの
fileno()メソッドが返す整数) を複製し、その結果からソケットオブジェクトを作成します。 アドレスファミリー、ソケットの種類、プロトコル番号はsocket()関数と同じです。 ファイル記述子はソケットを指す必要がありますが、これは検査されません。 ファイル記述子が無効な場合、その後のオブジェクトへの操作が失敗することがあります。 この関数が必要になることはまれですが、プログラムに標準入力や標準出力として渡されたソケット (Unix の inet デーモンから起動されたサーバなど) のソケットオプションを取得・設定するために使えます。 ソケットはブロッキングモードであると仮定されます。新たに作成されたソケットは 継承不可 です。
バージョン 3.4 で変更: 返されるソケットは継承不可になりました。
socket.share()メソッドから取得した data からソケットオブジェクトを生成します。ソケットはブロッキングモードだと仮定されます。利用可能な環境: Windows.
Added in version 3.3.
その他の関数¶
socket モジュールは、ネットワーク関連のさまざまなサービスも提供します:
- socket.close(fd)¶
ソケットのファイル記述子を閉じます。
os.close()のソケット版です。 一部のプラットフォーム (特に Windows) では、os.close()はソケットのファイル記述子には使えません。Added in version 3.7.
- socket.getaddrinfo(host, port, family=AF_UNSPEC, type=0, proto=0, flags=0)¶
この関数は、基盤となるシステムの C 関数
getaddrinfoをラップします。host / port 引数の指すアドレス情報を、そのサービスに接続されたソケットを作成するために必要な全ての引数が入った 5 要素のタプルのシーケンスに変換します。 host はドメイン名、IPv4/v6アドレスの文字列、または
Noneです。 port は'http'のようなサービス名文字列、ポート番号を表す数値、またはNoneです。 host と port にNoneを指定すると C APIにNULLを渡せます。family、type、proto 引数を指定すると、オプションを設定して、返されるアドレスのリストを制限できます。 結果を制限しない場合は、それぞれのデフォルト値 (
AF_UNSPEC、0、0) を渡してください。 詳しくは後述の注記を参照してください。flags 引数には
AI_*定数を 1 つ、または複数組み合わせて指定でき、結果の計算方法と返し方に影響します。 例えばAI_NUMERICHOSTはドメイン名の解決を無効にし、host がドメイン名の場合にエラーを送出します。この関数は以下の構造をとる 5 要素のタプルのリストを返します:
(family, type, proto, canonname, sockaddr)このタプルの family、type、proto はすべて整数で、
socket()関数に渡すための値です。 flags 引数にAI_CANONNAMEが含まれる場合、canonname は host の正規名を表す文字列になります。 そうでなければ canonname は空になります。 sockaddr はソケットアドレスを表すタプルで、返された family と Python のコンパイル時のフラグによって形式が決まります。socket.connect()メソッドに渡すための値です。sockaddr は次のいずれかです:
AF_INETの場合は、2 要素のタプル(address, port)AF_INET6で Python が--enable-ipv6(デフォルト) でコンパイルされた場合は、4 要素のタプル(address, port, flowinfo, scope_id)AF_INET6で Python が--disable-ipv6でコンパイルされた場合は、生のデータを含む 2 要素のタプル
注釈
getaddrinfo()の結果を使ってソケットを作成する場合 (例えば canonname の取得だけが目的ではない場合) は、 アプリケーションで扱える type (SOCK_STREAMやSOCK_DGRAMなど) や proto (IPPROTO_TCPやIPPROTO_UDPなど) で結果を制限することを検討してください。family、type、proto、flags がデフォルト値の場合の動作は、システムによって異なります。
多くのシステム (例えば、ほとんどの Linux 構成) は、一致するすべてのアドレスをソートしたリストを返します。 通常、接続が成功するまでこの順序でアドレスへの接続を試みてください (Happy Eyeballs アルゴリズムなどを使い、並行して試すこともできます)。 このようなシステムでは、type や proto を制限すると、失敗する接続や利用できない接続を試すことを避けやすくなります。
一方、アドレスを 1 つしか返さないシステムもあります (例えば、Solaris や AIX の構成で報告されています)。 このようなシステムでは、type や proto を制限すると、利用可能なアドレスを得やすくなります。
引数
host,port,family,type,protocol付きで 監査イベントsocket.getaddrinfoを送出します。次の例では、
example.orgの 80 番ポートに TCP 接続するとした場合のアドレス情報を取得します (IPv6 が有効でなければ、システムによって結果が異なることがあります)。>>> socket.getaddrinfo("example.org", 80, proto=socket.IPPROTO_TCP) [(socket.AF_INET6, socket.SOCK_STREAM, 6, '', ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)), (socket.AF_INET, socket.SOCK_STREAM, 6, '', ('93.184.216.34', 80))]
バージョン 3.2 で変更: パラメータをキーワード引数で渡すことができるようになりました。
バージョン 3.7 で変更: IPv6 マルチキャストアドレスでは、アドレスを表す文字列に
%scope_id部分が含まれなくなりました。
- socket.getfqdn([name])¶
name の完全修飾ドメイン名を返します。 name が省略された場合や空の場合は、ローカルホストと解釈します。 完全修飾名を探すため、
gethostbyaddr()が返すホスト名を調べ、次にホストの別名があればそれらを調べます。 ピリオドを含む最初の名前が選ばれます。 完全修飾ドメイン名が得られず、name が指定されていれば、name をそのまま返します。 name が空または'0.0.0.0'の場合は、gethostname()が返すホスト名を返します。
- socket.gethostbyname(hostname)¶
ホスト名を
'100.50.200.5'のようなIPv4形式のアドレスに変換します。ホスト名としてIPv4アドレスを指定した場合、その値は変換せずにそのまま返ります。gethostbyname()APIへのより完全なインターフェイスが必要であれば、gethostbyname_ex()を参照してください。gethostbyname()は、IPv6名前解決をサポートしていません。IPv4/ v6のデュアルスタックをサポートする場合はgetaddrinfo()を使用します。引数
hostnameを指定して 監査イベントsocket.gethostbynameを送出します。利用可能な環境: not WASI.
- socket.gethostbyname_ex(hostname)¶
ホスト名を IPv4 アドレス形式に変換する拡張インターフェースです。 3 要素のタプル
(hostname, aliaslist, ipaddrlist)を返します。 hostname はそのホストの主なホスト名、aliaslist は同じアドレスを指す別のホスト名のリスト (空の場合もあります)、 ipaddrlist は同じホストの同じインターフェースの IPv4 アドレスのリストです (多くの場合はアドレス 1 つですが、常にそうとは限りません)。gethostbyname_ex()は IPv6 の名前解決をサポートしていません。 IPv4/v6 デュアルスタックをサポートするには、代わりにgetaddrinfo()を使ってください。引数
hostnameを指定して 監査イベントsocket.gethostbynameを送出します。利用可能な環境: not WASI.
- socket.gethostname()¶
Pythonインタープリタを現在実行しているマシンのホスト名を含む文字列を返します。
引数無しで 監査イベント
socket.gethostnameを送出します。注意:
gethostname()は完全修飾ドメイン名を返すとは限りません。完全修飾ドメイン名が必要であれば、getfqdn()を使用してください。利用可能な環境: not WASI.
- socket.gethostbyaddr(ip_address)¶
3 要素のタプル
(hostname, aliaslist, ipaddrlist)を返します。 hostname は指定された ip_address に対応する主なホスト名、aliaslist は同じアドレスを指す別のホスト名のリスト (空の場合もあります)、 ipaddrlist は同じホストの同じインターフェースの IPv4/v6 アドレスのリストです (ほとんどの場合、アドレスは 1 つだけです)。 完全修飾ドメイン名を得るにはgetfqdn()関数を使ってください。gethostbyaddr()は IPv4 と IPv6 の両方をサポートしています。引数
ip_addressを指定して 監査イベントsocket.gethostbyaddrを送出します。利用可能な環境: not WASI.
- socket.getnameinfo(sockaddr, flags)¶
ソケットアドレス sockaddr を 2 要素のタプル
(host, port)に変換します。 flags の設定に応じて、結果の host には完全修飾ドメイン名または数値表記のアドレスが入ります。 同様に、port には文字列のポート名または数値のポート番号が入ります。IPv6 アドレスで、sockaddr に意味のある scope_id が含まれている場合は、ホスト部分に
%scope_idが追加されます。 通常、マルチキャストアドレスの場合にこうなります。flags について詳しくは getnameinfo(3) を参照してください。
引数
sockaddrを指定して 監査イベントsocket.getnameinfoを送出します。利用可能な環境: not WASI.
- socket.getprotobyname(protocolname)¶
インターネットプロトコル名 (
'icmp'など) を、socket()関数の省略可能な 3 番目の引数に渡せる定数に変換します。 通常、これは "raw" モード (SOCK_RAW) で開くソケットでのみ必要です。 通常のソケットモードでは、プロトコルを省略するかゼロを指定すると、適切なプロトコルが自動的に選ばれます。利用可能な環境: not WASI.
- socket.getservbyname(servicename[, protocolname])¶
インターネットサービス名とプロトコルから、そのサービスのポート番号を取得します。省略可能なプロトコル名として、
'tcp'か'udp'のどちらかを指定することができます。指定がなければどちらのプロトコルにもマッチします。引数
servicename,protocolnameを指定して 監査イベントsocket.getservbynameを送出します。利用可能な環境: not WASI.
- socket.getservbyport(port[, protocolname])¶
インターネットポート番号とプロトコル名から、サービス名を取得します。省略可能なプロトコル名として、
'tcp'か'udp'のどちらかを指定することができます。指定がなければどちらのプロトコルにもマッチします。引数
port,protocolnameを指定して 監査イベントsocket.getservbyportを送出します。利用可能な環境: not WASI.
- socket.ntohl(x)¶
32ビットの正の整数のバイトオーダを、ネットワークバイトオーダからホストバイトオーダに変換します。ホストバイトオーダとネットワークバイトオーダが一致するマシンでは、この関数は何もしません。それ以外の場合は4バイトのスワップを行います。
- socket.ntohs(x)¶
16ビットの正の整数のバイトオーダを、ネットワークバイトオーダからホストバイトオーダに変換します。ホストバイトオーダとネットワークバイトオーダが一致するマシンでは、この関数は何もしません。それ以外の場合は2バイトのスワップを行います。
バージョン 3.10 で変更: x が 16 ビット符号なし整数に収まらない場合は、
OverflowErrorを送出します。
- socket.htonl(x)¶
32ビットの正の整数のバイトオーダを、ホストバイトオーダからネットワークバイトオーダに変換します。ホストバイトオーダとネットワークバイトオーダが一致するマシンでは、この関数は何もしません。それ以外の場合は4バイトのスワップを行います。
- socket.htons(x)¶
16ビットの正の整数のバイトオーダを、ホストバイトオーダからネットワークバイトオーダに変換します。ホストバイトオーダとネットワークバイトオーダが一致するマシンでは、この関数は何もしません。それ以外の場合は2バイトのスワップを行います。
バージョン 3.10 で変更: x が 16 ビット符号なし整数に収まらない場合は、
OverflowErrorを送出します。
- socket.inet_aton(ip_string)¶
ドット記法によるIPv4アドレス(
'123.45.67.89'など)を32ビットにパックしたバイナリ形式に変換し、長さ4のバイト列オブジェクトとして返します。この関数が返す値は、標準Cライブラリのin_addr型を使用する関数に渡す事ができます。inet_aton()はドットが 3 個未満の文字列も受け取ります; 詳細については Unix のマニュアル inet(3) を参照してください。この関数に渡した IPv4 アドレス文字列が無効な場合は、
OSErrorを送出します。 具体的にどの文字列が有効かは、基盤となる C のinet_aton()実装によって異なります。inet_aton()は、IPv6をサポートしません。IPv4/v6のデュアルスタックをサポートする場合はinet_pton()を使用します。
- socket.inet_ntoa(packed_ip)¶
32 ビットにパックされた IPv4 アドレス (長さ 4 バイトの bytes-like object) を、4 つの数をドットで区切る標準的な文字列形式 ('123.45.67.89' など) に変換します。 この関数は、
in_addr型、つまりこの関数が引数として受け取る 32 ビットにパックされたバイナリデータに対する C の型、を使用する標準 C ライブラリのプログラムとやりとりする場合に便利です。この関数に渡すバイトシーケンスの長さが4バイト以外であれば、
OSErrorが発生します。inet_ntoa()は、IPv6をサポートしません。IPv4/v6のデュアルスタックをサポートする場合はinet_ntop()を使用します。バージョン 3.5 で変更: 書き込み可能な bytes-like object を使用できるようになりました。
- socket.inet_pton(address_family, ip_string)¶
IPアドレスを、アドレスファミリ固有の文字列からパックしたバイナリ形式に変換します。
inet_pton()は、in_addr型 (inet_aton()と同様)やin6_addrを使用するライブラリやネットワークプロトコルを呼び出す際に使用することができます。現在サポートされている address_family は、
AF_INETとAF_INET6です。 ip_string に不正なIPアドレス文字列を指定すると、OSErrorが発生します。有効な ip_string は、 address_family とinet_pton()の実装によって異なります。利用可能な環境: Unix, Windows.
バージョン 3.4 で変更: Windowsで利用可能になりました
- socket.inet_ntop(address_family, packed_ip)¶
パックしたIPアドレス (数バイトからなる bytes-like オブジェクト ) を、
'7.10.0.5'や'5aef:2b::8'などの標準的な、アドレスファミリ固有の文字列形式に変換します。inet_ntop()は (inet_ntoa()と同様に)、in_addr型やin6_addr型のオブジェクトを返すライブラリやネットワークプロトコル等で使用することができます。現在サポートされている address_family の値は、
AF_INETとAF_INET6です。バイトオブジェクトの packed_ip の長さが、指定したアドレスファミリで適切な長さでない場合、ValueErrorが発生します。inet_ntop()の呼び出しでエラーが起こると、OSErrorが発生します。利用可能な環境: Unix, Windows.
バージョン 3.4 で変更: Windowsで利用可能になりました
バージョン 3.5 で変更: 書き込み可能な bytes-like object を使用できるようになりました。
- socket.CMSG_LEN(length)¶
長さ length のデータを伴う制御メッセージ (補助データ) 1 件について、末尾のパディングを除いた全体の長さを返します。 この値は、
recvmsg()で制御メッセージを 1 件受信するためのバッファサイズとして使える場合が多くあります。 ただし RFC 3542 では、移植可能なアプリケーションはCMSG_SPACE()を使い、バッファの最後のメッセージであってもパディング用の領域を含める必要があると定めています。 length が許容範囲外の場合はOverflowErrorを送出します。利用可能な環境: Unix, not WASI.
ほとんどの Unix プラットフォーム。
Added in version 3.3.
- socket.CMSG_SPACE(length)¶
長さ length のデータを伴う制御メッセージ (補助データ) 1 件を
recvmsg()で受信するために必要な、末尾のパディングを含むバッファサイズを返します。 複数件を受信するには、それぞれのデータ長に対するCMSG_SPACE()の戻り値を合計したバッファサイズが必要です。 length が許容範囲外の場合はOverflowErrorを送出します。この関数を提供せずに制御メッセージをサポートするシステムもあります。 また、パディング領域に追加のデータが収まることがあるため、この関数の結果でバッファサイズを設定しても、受信できる制御メッセージの量を厳密に制限できるとは限りません。
利用可能な環境: Unix, not WASI.
ほとんどの Unix プラットフォーム。
Added in version 3.3.
- socket.getdefaulttimeout()¶
新規に生成されたソケットオブジェクトの、デフォルトのタイムアウト値を浮動小数点形式の秒数で返します。タイムアウトを使用しない場合には
Noneを返します。最初に socket モジュールがインポートされた時の初期値はNoneです。
- socket.setdefaulttimeout(timeout)¶
新しいソケットオブジェクトのデフォルトのタイムアウトを秒数 (実数) で設定します。 socket モジュールの初回のインポート時には、デフォルトは
Noneです。 指定できる値とそれぞれの意味はsettimeout()を参照してください。バージョン 3.15 で変更: 整数や浮動小数点数に限らず、任意の実数を受け付けるようになりました。
- socket.sethostname(name)¶
マシンのホスト名を name に設定します。必要な権限がない場合は
OSErrorを送出します。引数
nameを指定して 監査イベントsocket.sethostnameを送出します。利用可能な環境: Unix, not Android.
Added in version 3.3.
- socket.if_nameindex()¶
ネットワークインターフェース情報を表すタプル (インデックスの整数、名前の文字列) のリストを返します。 システムコールが失敗した場合、
OSError例外を送出します。利用可能な環境: Unix, Windows, not WASI.
Added in version 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)¶
インターフェース名 if_name に対応するネットワークインターフェースのインデックス番号を返します。対応するインターフェースが存在しない場合は
OSError例外を送出します。利用可能な環境: Unix, Windows, not WASI.
Added in version 3.3.
バージョン 3.8 で変更: Windows のサポートが追加されました。
参考
「インターフェース名」は
if_nameindex()で説明している名前です。
- socket.if_indextoname(if_index)¶
インターフェースインデックス番号 if_index に対応するネットワークインターフェース名を返します。対応するインターフェースが存在しない場合は
OSError例外を送出します。利用可能な環境: Unix, Windows, not WASI.
Added in version 3.3.
バージョン 3.8 で変更: Windows のサポートが追加されました。
参考
「インターフェース名」は
if_nameindex()で説明している名前です。
socket オブジェクト¶
- class socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)¶
アドレスファミリー、ソケットタイプ、プロトコル番号を指定してソケットを作成します。アドレスファミリーには
AF_INET(デフォルト値),AF_INET6,AF_UNIX,AF_CAN,AF_PACKET,AF_RDSを指定することができます。ソケットタイプにはSOCK_STREAM(デフォルト値),SOCK_DGRAM,SOCK_RAWまたは他のSOCK_定数の何れかを指定します。プロトコル番号は通常省略するか、または0を指定しますが、アドレスファミリーにAF_CANを指定した場合は、プロトコル番号にはCAN_RAW,CAN_BCM,CAN_ISOTP,CAN_J1939のいずれかを指定すべきです。fileno を指定すると、family、type、proto の値を指定されたファイル記述子から自動検出します。 family、type、proto 引数を明示的に指定して呼び出すと、自動検出された値を上書きできます。 これは、例えば
socket.getpeername()の戻り値を Python でどう表すかにだけ影響し、実際の OS のリソースには影響しません。socket.fromfd()と異なり、fileno を指定した場合はソケットを複製せず、同じソケットを使います。 これは、切り離したソケットをclose()で閉じる場合などに役立ちます。新たに作成されたソケットは 継承不可 です。
引数
self,family,type,protocol付きで 監査イベントsocket.__new__を送出します。バージョン 3.3 で変更: AF_CAN, AF_RDS ファミリーが追加されました。
バージョン 3.4 で変更: CAN_BCMプロトコルが追加されました。
バージョン 3.4 で変更: 返されるソケットは継承不可になりました。
バージョン 3.7 で変更: CAN_ISOTP プロトコルが追加されました。
バージョン 3.7 で変更: type に
SOCK_NONBLOCKやSOCK_CLOEXECのビットフラグを指定しても、それらはクリアされ、socket.typeには反映されません。 ただし、基盤となるシステムのsocket()呼び出しには渡されます。 したがって、sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
は、
SOCK_NONBLOCKをサポートする OS では非ブロッキングソケットを作成しますが、sock.typeはsocket.SOCK_STREAMに設定されます。バージョン 3.9 で変更: CAN_J1939 プロトコルが追加されました。
バージョン 3.10 で変更: IPPROTO_MPTCP プロトコルが追加されました。
ソケットオブジェクトは以下のメソッドを持ちます。
makefile()以外のメソッドは、Unixのソケット用システムコールに対応しています。バージョン 3.2 で変更: コンテキストマネージャー プロトコルをサポートするようになりました。 コンテキストマネージャーを終了することは、
close()を呼び出すことに相当します。- accept()¶
接続を受け付けます。ソケットはアドレスにbind済みで、listen中である必要があります。戻り値は
(conn, address)のペアで、 conn は接続を通じてデータの送受信を行うための 新しい ソケットオブジェクト、 address は接続先でソケットにbindしているアドレスを示します。新たに作成されたソケットは 継承不可 です。
バージョン 3.4 で変更: ソケットが継承不可になりました。
バージョン 3.5 で変更: システムコールが中断されシグナルハンドラが例外を送出しなかった場合、このメソッドは
InterruptedError例外を送出する代わりにシステムコールを再試行するようになりました (論拠については PEP 475 を参照してください)。
- bind(address)¶
ソケットを address にバインドします。 ソケットはまだバインドされていない必要があります。 address の形式はアドレスファミリーによって異なります。 ソケットファミリー を参照してください。
引数
self,addressを指定して 監査イベントsocket.bindを送出します。利用可能な環境: not WASI.
- close()¶
ソケットを閉じた状態にします。
makefile()で作成されたファイルオブジェクトがすべて閉じられると、基盤となるシステムリソース (ファイル記述子など) も閉じられます。 それ以降、ソケットオブジェクトへの操作はすべて失敗します。 相手側は、キューに残ったデータがフラッシュされた後は、それ以上データを受信しません。ソケットはガベージコレクション時に自動的にクローズされます。しかし、明示的に
close()するか、with文の中でソケットを使うことを推奨します。バージョン 3.6 で変更: 基盤となる
close()呼び出しでエラーが発生した場合、OSErrorを送出するようになりました。注釈
close()は接続に関連するリソースを解放しますが、接続を直ちに閉じるとは限りません。 接続を速やかに閉じたい場合は、close()の前にshutdown()を呼び出してください。
- connect(address)¶
address のリモートソケットに接続します。 address の形式はアドレスファミリーによって異なります。 ソケットファミリー を参照してください。
接続がシグナルによって中断されても、シグナルハンドラーが例外を送出せず、ソケットがブロッキングモードまたはタイムアウト付きであれば、 このメソッドは接続が完了するまで待機するか、タイムアウト時に
TimeoutErrorを送出します。 非ブロッキングソケットで接続がシグナルによって中断された場合は、InterruptedError(またはシグナルハンドラーが送出した例外) を送出します。引数
self,addressを指定して 監査イベントsocket.connectを送出します。バージョン 3.5 で変更: このメソッドは、接続が信号によって中断され、信号ハンドラが例外を送出せず、ソケットがブロックであるかタイムアウトが設定されている場合、
InterruptedError例外を送出する代わりに、接続を完了するまで待機するようになりました (論拠については PEP 475 を参照してください)。利用可能な環境: not WASI.
- connect_ex(address)¶
connect(address)と同様ですが、C レベルのconnect()呼び出しが返すエラーに対して、例外を送出する代わりにエラーを示す値を返します (「ホストが見つからない」など、ほかの問題では例外が送出されることがあります)。 この値は、操作に成功した場合は0、そうでなければerrno変数の値です。 例えば、非同期接続のサポートに役立ちます。引数
self,addressを指定して 監査イベントsocket.connectを送出します。利用可能な環境: not WASI.
- detach()¶
実際にファイル記述子を閉じることなく、ソケットオブジェクトを閉じた状態にします。ファイル記述子は返却され、他の目的に再利用することができます。
Added in version 3.2.
- fileno()¶
ソケットのファイル記述子を小さな整数で返します。 失敗時には、-1 を返します。 ファイル記述子は、
select.select()などで使用します。Windowsではこのメソッドで返された小整数をファイル記述子を扱う箇所 (
os.fdopen()など) で利用できません。 Unix にはこの制限はありません。
- get_inheritable()¶
ソケットのファイル記述子またはソケットのハンドルの 継承可能フラグ を取得します。ソケットが子プロセスへ継承可能なら
True、継承不可ならFalseを返します。Added in version 3.4.
- getpeername()¶
ソケットの接続先のリモートアドレスを返します。 例えば、リモートの IPv4/v6 ソケットのポート番号を調べる際に役立ちます。 返されるアドレスの形式はアドレスファミリーによって異なります。 ソケットファミリー を参照してください。 一部のシステムでは、この関数はサポートされていません。
- getsockname()¶
ソケット自身のアドレスを返します。 例えば、IPv4/v6 ソケットのポート番号を調べる際に役立ちます。 返されるアドレスの形式はアドレスファミリーによって異なります。 ソケットファミリー を参照してください。
- getsockopt(level, optname[, buflen])¶
指定されたソケットオプションの値を返します (Unix のマニュアルページ getsockopt(2) を参照)。 必要なシンボル定数 (SO_* など) はこのモジュールで定義されています。 buflen を省略すると、整数のオプションと仮定して整数値を返します。 buflen を指定すると、オプションの値を受け取るバッファの最大長となり、そのバッファを bytes オブジェクトとして返します。 バッファの内容のデコードは呼び出し側で行う必要があります (バイト列にエンコードされた C の構造体をデコードする方法は、オプションの組み込みモジュール
structを参照してください)。利用可能な環境: not WASI.
- getblocking()¶
ソケットがブロッキングモードなら
True、非ブロッキングモードならFalseを返します。これは
socket.gettimeout() != 0の検査と同等です。Added in version 3.7.
- gettimeout()¶
ソケットに指定されたタイムアウト値を取得します。タイムアウト値が設定されている場合には浮動小数点型で秒数が、設定されていなければ
Noneが返ります。この値は、最後に呼び出されたsetblocking()またはsettimeout()によって設定されます。
- ioctl(control, option)¶
ioctl()メソッドは WSAIoctl システムインターフェースへの制限されたインターフェースです。詳しい情報については、 Win32 documentation を参照してください。他のプラットフォームでは一般的な
fcntl.fcntl()とfcntl.ioctl()が使われるでしょう; これらの関数は第 1 引数としてソケットオブジェクトを取ります。現在、以下のコントロールコードのみがサポートされています。
SIO_RCVALL,SIO_KEEPALIVE_VALS,SIO_LOOPBACK_FAST_PATH。利用可能な環境: Windows
バージョン 3.6 で変更:
SIO_LOOPBACK_FAST_PATHが追加されました。
- listen([backlog])¶
サーバーを有効にして、接続を受け付けるようにします。backlog が指定されている場合、少なくとも 0 以上でなければなりません (それより低い場合、0 に設定されます)。システムが新しい接続を拒否するまでに許可する未受付の接続の数を指定します。指定しない場合、デフォルトの妥当な値が選択されます。
利用可能な環境: not WASI.
バージョン 3.5 で変更: backlog 引数が任意になりました。
- makefile(mode='r', buffering=None, *, encoding=None, errors=None, newline=None)¶
ソケットに関連付けられた ファイルオブジェクト を返します。 返される具体的な型は
makefile()に渡す引数によって異なります。 引数は組み込み関数open()と同じように解釈されますが、サポートされる mode の値は'r'(デフォルト)、'w'、'b'、またはその組み合わせだけです。ソケットはブロッキングモードでなければなりません。タイムアウトを設定することはできますが、タイムアウトが発生すると、ファイルオブジェクトの内部バッファが矛盾した状態になることがあります。
makefile()が返すファイルオブジェクトを閉じても、ほかのすべてのファイルオブジェクトが閉じられ、かつソケットオブジェクトのclose()が呼び出されていなければ、元のソケットは閉じられません。注釈
Windows では
subprocess.Popen()の stream 引数などファイルディスクリプタつき file オブジェクトが期待されている場所では、makefile()によって作成される file-like オブジェクトは使用できません。
- recv(bufsize[, flags])¶
Receive data from the socket. The return value is a bytes object representing the data received. The maximum amount of data to be received at once is specified by bufsize. A returned empty bytes object indicates that the client has disconnected. See the Unix manual page recv(2) for the meaning of the optional argument flags; it defaults to zero.
バージョン 3.5 で変更: システムコールが中断されシグナルハンドラが例外を送出しなかった場合、このメソッドは
InterruptedError例外を送出する代わりにシステムコールを再試行するようになりました (論拠については PEP 475 を参照してください)。
- recvfrom(bufsize[, flags])¶
ソケットからデータを受信します。 戻り値は
(bytes, address)のペアです。 bytes は受信したデータを表す bytes オブジェクトで、address はデータを送信したソケットのアドレスです。 省略可能な引数 flags の意味は、Unix のマニュアルページ recv(2) を参照してください。 デフォルト値はゼロです。 address の形式はアドレスファミリーによって異なります。 ソケットファミリー を参照してください。バージョン 3.5 で変更: システムコールが中断されシグナルハンドラが例外を送出しなかった場合、このメソッドは
InterruptedError例外を送出する代わりにシステムコールを再試行するようになりました (論拠については PEP 475 を参照してください)。バージョン 3.7 で変更: IPv6 マルチキャストアドレスでは、address の最初の要素に
%scope_id部分が含まれなくなりました。 完全な IPv6 アドレスを得るにはgetnameinfo()を使ってください。
- recvmsg(bufsize[, ancbufsize[, flags]])¶
ソケットから通常のデータ (最大 bufsize バイト) と補助的なデータを受信します。ancbufsize 引数により、補助的なデータの受信に使用される内部バッファのバイト数として、サイズが設定されます。このデフォルトは 0 で、補助的なデータを受信しないことを意味します。
CMSG_SPACE()またはCMSG_LEN()を使用して、補助的なデータの適切なサイズを計算することができ、バッファ内に収まらないアイテムは、短縮されるか破棄されます。flags 引数はデフォルトでは 0 で、recv()での意味と同じ意味を持ちます。戻り値は 4 要素のタプル
(data, ancdata, msg_flags, address)です。data アイテムは、受信した非付属的データを保持するbytesオブジェクトです。ancdata アイテムは、ゼロ以上のタプル(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") # int の配列 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: # 末尾の不完全な整数を無視してデータを追加する。 fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) return msg, list(fds)
利用可能な環境: Unix.
ほとんどの Unix プラットフォーム。
Added in version 3.3.
バージョン 3.5 で変更: システムコールが中断されシグナルハンドラが例外を送出しなかった場合、このメソッドは
InterruptedError例外を送出する代わりにシステムコールを再試行するようになりました (論拠については PEP 475 を参照してください)。
- recvmsg_into(buffers[, ancbufsize[, flags]])¶
recvmsg()と同様に動作してソケットから通常のデータと付属的なデータを受信しますが、非付属的データは新しいバイトオブジェクトとして返すのではなく、指定された一連のバッファに分散して書き込みます。 buffers 引数は書き込み可能なバッファをエクスポートするオブジェクトのイテラブルでなければなりません (例:bytearrayオブジェクト)。 これらは、全てに書き込まれるか、残りバッファがなくなるまで、非付属的データの連続チャンクで埋められます。 オペレーティングシステムによって、使用できるバッファの数が制限 (sysconf()値SC_IOV_MAX) されている場合があります。 ancbufsize 引数と flags 引数は、recvmsg()での意味と同じ意味を持ちます。戻り値は 4 要素のタプル
(nbytes, ancdata, msg_flags, address)です。 ここで、nbytes はバッファに書き込まれた非付属的データの総バイト数で、ancdata、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---')]
利用可能な環境: Unix.
ほとんどの Unix プラットフォーム。
Added in version 3.3.
- recvfrom_into(buffer[, nbytes[, flags]])¶
ソケットからデータを受信し、新しいバイト列を作る代わりに buffer に書き込みます。 戻り値は
(nbytes, address)のペアです。 nbytes は受信したバイト数で、address はデータを送信したソケットのアドレスです。 省略可能な引数 flags の意味は、Unix のマニュアルページ recv(2) を参照してください。 デフォルト値はゼロです。 address の形式はアドレスファミリーによって異なります。 ソケットファミリー を参照してください。
- recv_into(buffer[, nbytes[, flags]])¶
nbytes バイトまでのデータをソケットから受信して、そのデータを新しいバイト文字列にするのではなく buffer に保存します。 nbytes が指定されない(あるいは0が指定された)場合、 buffer の利用可能なサイズまで受信します。受信したバイト数を返り値として返します。オプション引数 flags (デフォルト:0) の意味については、 Unix マニュアルページ recv(2) を参照してください。
- send(bytes[, flags])¶
ソケットにデータを送信します。 ソケットはリモートソケットに接続されている必要があります。 省略可能な flags 引数の意味は
recv()と同じです。 送信したバイト数を返します。 すべてのデータを送信できたかどうかは、アプリケーション側で確認する必要があります。 データの一部だけを送信した場合は、残りのデータの送信を試みる必要があります。 この点について詳しくは ソケットプログラミング HOWTO を参照してください。バージョン 3.5 で変更: システムコールが中断されシグナルハンドラが例外を送出しなかった場合、このメソッドは
InterruptedError例外を送出する代わりにシステムコールを再試行するようになりました (論拠については PEP 475 を参照してください)。
- sendall(bytes[, flags])¶
ソケットにデータを送信します。 ソケットはリモートソケットに接続されている必要があります。 省略可能な flags 引数の意味は
recv()と同じです。send()と異なり、このメソッドはすべてのデータを送信するかエラーが発生するまで、bytes のデータを送信し続けます。 成功するとNoneを返します。 エラー時は例外を送出しますが、データをどこまで正常に送信できたか、または全く送信できなかったかを知る方法はありません。バージョン 3.5 で変更: ソケットのタイムアウトは、データが正常に送信される度にリセットされなくなりました。ソケットのタイムアウトは、すべてのデータを送る最大の合計時間となります。
バージョン 3.5 で変更: システムコールが中断されシグナルハンドラが例外を送出しなかった場合、このメソッドは
InterruptedError例外を送出する代わりにシステムコールを再試行するようになりました (論拠については PEP 475 を参照してください)。
- sendto(bytes, address)¶
- sendto(bytes, flags, address)
ソケットにデータを送信します。 送信先のソケットは address で指定するため、ソケットはリモートソケットに接続しておかないでください。 省略可能な flags 引数の意味は
recv()と同じです。 送信したバイト数を返します。 address の形式はアドレスファミリーによって異なります。 ソケットファミリー を参照してください。引数
self,addressを指定して 監査イベントsocket.sendtoを送出します。バージョン 3.5 で変更: システムコールが中断されシグナルハンドラが例外を送出しなかった場合、このメソッドは
InterruptedError例外を送出する代わりにシステムコールを再試行するようになりました (論拠については PEP 475 を参照してください)。
- sendmsg(buffers[, ancdata[, flags[, address]]])¶
非付属的なデータを一連のバッファから集め、単一のメッセージにまとめることで、通常のデータと付属的なデータをソケットに送信します。buffers 引数は、非付属的なデータを bytes-like objects (例:
bytesオブジェクト) のイテラブルとして指定します。オペレーティングシステムによって、使用できるバッファの数が制限 (sysconf()値SC_IOV_MAX) されている場合があります。ancdata 引数は付属的なデータ (制御メッセージ) をゼロ以上のタプル(cmsg_level, cmsg_type, cmsg_data)のイテラブルとして指定します。ここで、cmsg_level と cmsg_type はそれぞれプロトコルレベルとプロトコル固有のタイプを指定する整数で、cmsg_data は関連データを保持するバイトライクオブジェクトです。一部のシステム (特にCMSG_SPACE()を持たないシステム) では、一度の呼び出しで一つの制御メッセージの送信しかサポートされていない場合があります。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))])
利用可能な環境: Unix, not WASI.
ほとんどの Unix プラットフォーム。
引数
self,addressを指定して 監査イベントsocket.sendmsgを送出します。Added in version 3.3.
バージョン 3.5 で変更: システムコールが中断されシグナルハンドラが例外を送出しなかった場合、このメソッドは
InterruptedError例外を送出する代わりにシステムコールを再試行するようになりました (論拠については PEP 475 を参照してください)。
- sendmsg_afalg([msg, ]*, op[, iv[, assoclen[, flags]]])¶
sendmsg()のAF_ALGソケット用に特化したバージョンです。AF_ALGソケットの、モード、IV、AEAD に関連づけられたデータ長、フラグを設定します。利用可能な環境: Linux >= 2.6.38.
Added in version 3.6.
- sendfile(file, offset=0, count=None)¶
高性能な
os.sendfileを使ってファイルを EOF まで送信し、送信した総バイト数を返します。 file はバイナリモードで開いた通常ファイルのオブジェクトでなければなりません。os.sendfileが利用できない場合 (Windows など) や、file が通常ファイルでない場合は、代わりにsend()を使います。 offset はファイルの読み取り開始位置を指定します。 count を指定すると、EOF まで送信する代わりに、指定されたバイト数を送信します。 正常に戻る場合もエラーが起きた場合もファイル位置は更新されます。 エラー時にはfile.tell()で送信したバイト数を調べられます。 ソケットはSOCK_STREAM型でなければなりません。 非ブロッキングソケットはサポートされていません。Added in version 3.5.
- setblocking(flag)¶
ソケットをブロッキングモード、または非ブロッキングモードに設定します。flag が False の場合にはソケットは非ブロッキングモードになり、True の場合にはブロッキングモードになります。
このメソッドは、次の
settimeout()呼び出しの省略表記です:sock.setblocking(True)はsock.settimeout(None)と等価ですsock.setblocking(False)はsock.settimeout(0.0)と等価です
バージョン 3.7 で変更:
socket.typeにSOCK_NONBLOCKフラグを適用しなくなりました。
- settimeout(value)¶
ブロックするソケット操作にタイムアウトを設定します。 value 引数には、秒数を表す非負の実数または
Noneを指定できます。 ゼロ以外の値を指定すると、それ以降のソケット操作は、完了する前に value 秒が経過した場合にtimeout例外を送出します。 ゼロを指定すると、ソケットは非ブロッキングモードになります。Noneを指定すると、ソケットはブロッキングモードになります。詳しくは ソケットタイムアウトの注意事項 を参照してください。
バージョン 3.7 で変更:
socket.typeのSOCK_NONBLOCKフラグを切り替えなくなりました。バージョン 3.15 で変更: 整数や浮動小数点数に限らず、任意の実数を受け付けるようになりました。
- setsockopt(level, optname, value: int | Buffer)¶
- setsockopt(level, optname, None, optlen: int)
指定されたソケットオプションの値を設定します (Unix のマニュアルページ setsockopt(2) を参照)。 必要なシンボル定数 (SO_* など <socket-unix-constants>) はこのモジュールで定義されています。 値には、整数、
None、またはバッファを表す バイト列類似オブジェクト を指定できます。 最後の場合、バイト列に適切なビットが含まれていることを呼び出し側で保証する必要があります (C の構造体をバイト列にエンコードする方法は、オプションの組み込みモジュールstructを参照してください)。 value がNoneの場合は optlen 引数が必要です。 これは、C 関数setsockopt()をoptval=NULL、optlen=optlenで呼び出すことに相当します。バージョン 3.5 で変更: 書き込み可能な bytes-like object を使用できるようになりました。
バージョン 3.6 で変更: setsockopt(level, optname, None, optlen: int) の形式が追加されました。
利用可能な環境: not WASI.
- shutdown(how)¶
接続の片方向、または両方向を切断します。 how が
SHUT_RDの場合、以降は受信を行えません。 how がSHUT_WRの場合、以降は送信を行えません。 how がSHUT_RDWRの場合、以降は送受信を行えません。利用可能な環境: not WASI.
ソケットを複製し、対象のプロセスと共有するための bytes オブジェクトを返します。対象のプロセスを process_id で指定しなければなりません。戻り値の bytes オブジェクトは、何らかのプロセス間通信を使って対象のプロセスに伝えます。対象のプロセス側では、
fromshare()を使って複製されたソケットをとらえます。オペレーティング・システムは対象のプロセスに対してソケットを複製するため、このメソッドを呼び出した後であれば、元のソケットをクローズしても、対象のプロセスに渡ったソケットには影響がありません。利用可能な環境: Windows.
Added in version 3.3.
read()メソッドやwrite()メソッドはありません。 代わりに flags 引数を付けずにrecv()とsend()を使ってください。ソケットオブジェクトには以下の
socketコンストラクタに渡された値に対応した (読み出し専用) 属性があります。- family¶
ソケットファミリー。
- type¶
ソケットタイプ。
- proto¶
ソケットプロトコル。
ソケットタイムアウトの注意事項¶
ソケットオブジェクトは、ブロッキングモード、非ブロッキングモード、タイムアウトモードのうち、いずれか1つのモードをとります。デフォルトでは、ソケットは常にブロッキングモードで作成されますが、 setdefaulttimeout() で標準のモードを変更することができます。
ブロッキングモード での操作は、完了するか、または(接続がタイムアウトするなどして)システムがエラーを返すまで、ブロックされます。
非ブロッキングモード での操作は、ただちに完了できない場合、例外を送出して失敗します。この場合の例外の種類は、システムに依存するため、ここに記すことができません。
selectモジュールの関数を使って、ソケットの読み書きが利用可能かどうか、可能な場合はいつ利用できるかを調べることができます。タイムアウトモード での操作は、指定されたタイムアウトの時間内に完了しなければ、
timeout例外を送出します。タイムアウトの時間内にシステムがエラーを返した場合は、そのエラーを返します。
注釈
At the operating system level, sockets in timeout mode are internally set
in non-blocking mode. Also, the blocking and timeout modes are shared between
file descriptors and socket objects that refer to the same network endpoint.
This implementation detail can have visible consequences if e.g. you decide
to use the fileno() of a socket.
タイムアウトと connect メソッド¶
connect() もタイムアウト設定に従います。一般的に、 settimeout() を connect() の前に呼ぶか、 create_connection() にタイムアウト引数を渡すことが推奨されます。ただし、システムのネットワークスタックが Python のソケットタイムアウトの設定を無視して、自身の接続タイムアウトエラーを返すこともあります。
タイムアウトと accept メソッド¶
getdefaulttimeout() の戻り値が None でなければ、accept() メソッドが返すソケットはそのタイムアウトを引き継ぎます。
そうでなければ、動作は接続を待ち受けるソケットの設定によって異なります:
使用例¶
以下に TCP/IP プロトコルを使う最小限のサンプルプログラムを 4 つ示します。
受信したすべてのデータをそのまま送り返すサーバ (クライアント 1 つだけを処理) と、それを使うクライアントです。
サーバでは socket()、bind()、listen()、accept() の順に実行する必要があります (複数のクライアントを処理するには accept() を繰り返します)。
一方、クライアントで必要なのは socket()、connect() の順に実行することだけです。
また、サーバは接続を待ち受けるソケットではなく、accept() が返した新しいソケットで sendall() と recv() を行うことにも注意してください。
次のクライアントとサーバは、IPv4 のみをサポートしています。
# エコーサーバのプログラム
import socket
HOST = '' # 利用可能なすべてのインターフェースを表す名前
PORT = 50007 # 特権を必要としない任意のポート
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)
# エコークライアントのプログラム
import socket
HOST = 'daring.cwi.nl' # リモートホスト
PORT = 50007 # サーバが使うポートと同じ番号
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 の通信を受け入れないことがあります。 クライアント側は名前解決で得られたすべてのアドレスへの接続を試み、最初に接続できたアドレスにデータを送信します。
# エコーサーバのプログラム
import socket
import sys
HOST = None # 利用可能なすべてのインターフェースを表す名前
PORT = 50007 # 特権を必要としない任意のポート
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)
# エコークライアントのプログラム
import socket
import sys
HOST = 'daring.cwi.nl' # リモートホスト
PORT = 50007 # サーバが使うポートと同じ番号
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 socket を利用して非常にシンプルなネットワークスニファーを書きます。このサンプルを実行するには、インターフェースを操作するための管理者権限が必要です:
import socket
# 外部向けのネットワークインターフェース
HOST = socket.gethostbyname(socket.gethostname())
# raw ソケットを作成し、外部向けのインターフェースにバインドする
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
s.bind((HOST, 0))
# IP ヘッダーを含める
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
# すべてのパケットを受信する
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
# パケットを 1 つ受信する
print(s.recvfrom(65565))
# プロミスキャスモードを無効にする
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)
次の例では、ソケットインターフェースを使用してローソケットプロトコルを使用する 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 フレームのパックとアンパック (<linux/can.h> の 'struct can_frame' を参照)
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])
# raw ソケットを作成し、'vcan0' インターフェースにバインドする
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 言語によるソケットプログラミングの基礎については、以下の資料を参照してください。
An Introductory 4.3BSD Interprocess Communication Tutorial, by Stuart Sechrest
An Advanced 4.3BSD Interprocess Communication Tutorial, by Samuel J. Leffler et al,
両書とも UNIX Programmer's Manual, Supplementary Documents 1 (PS1:7章 PS1:8章)。ソケットの詳細については、各プラットフォームのソケット関連システムコールに関するドキュメントも参照してください。Unix ではマニュアルページ、WindowsではWinSock (または WinSock2) 仕様書をご覧ください。IPv6 対応の API については、 RFC 3493 "Basic Socket Interface Extensions for IPv6" を参照してください。