18.1。 ソケット —低レベルのネットワークインターフェイス
ソースコード: :source: `Lib / socket.py`
このモジュールは、BSD socket インターフェースへのアクセスを提供します。 これは、すべての最新のUnixシステム、Windows、MacOS、およびおそらく追加のプラットフォームで利用できます。
ノート
オペレーティングシステムのソケットAPIが呼び出されるため、一部の動作はプラットフォームに依存する場合があります。
Pythonインターフェースは、ソケット用のUnixシステムコールとライブラリインターフェースをPythonのオブジェクト指向スタイルに簡単に変換したものです。 socket()関数は socketオブジェクトを返し、そのメソッドはさまざまなものを実装します。ソケットシステムコール。 パラメータタイプはCインターフェイスよりもいくらか高レベルです。Pythonファイルでのread()
およびwrite()
操作と同様に、受信操作でのバッファ割り当ては自動であり、バッファ長は送信操作で暗黙的です。
18.1.1。 ソケットファミリ
システムとビルドオプションに応じて、このモジュールではさまざまなソケットファミリがサポートされます。
特定のソケットオブジェクトに必要なアドレス形式は、ソケットオブジェクトの作成時に指定されたアドレスファミリに基づいて自動的に選択されます。 ソケットアドレスは次のように表されます。
ファイルシステムノードにバインドされた 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, scopeid)
が使用されます。ここで、 flowinfo および scopeid はsin6_flowinfo
および[ Cのstruct sockaddr_in6
のX143X] メンバー。 socket モジュールメソッドの場合、下位互換性のために flowinfo および scopeid を省略できます。 ただし、 scopeid を省略すると、スコープ付きIPv6アドレスの操作で問題が発生する可能性があることに注意してください。AF_NETLINK
ソケットは、ペア(pid, groups)
として表されます。LinuxのみのTIPCのサポートは、
AF_TIPC
アドレスファミリーを使用して利用できます。 TIPCは、クラスター化されたコンピューター環境で使用するために設計された、オープンな非IPベースのネットワークプロトコルです。 アドレスはタプルで表され、フィールドはアドレスタイプによって異なります。 一般的なタプル形式は(addr_type, v1, v2, v3 [, scope])
です。ここで、addr_type は、
TIPC_ADDR_NAMESEQ
、TIPC_ADDR_NAME
、またはTIPC_ADDR_ID
のいずれかです。スコープは、
TIPC_ZONE_SCOPE
、TIPC_CLUSTER_SCOPE
、およびTIPC_NODE_SCOPE
のいずれかです。addr_type が
TIPC_ADDR_NAME
の場合、 v1 はサーバーの種類、 v2 はポート識別子、 v3 はポート識別子です。 0になります。addr_type が
TIPC_ADDR_NAMESEQ
の場合、 v1 はサーバーの種類、 v2 は小さい方のポート番号、 v3 は上位ポート番号です。addr_type が
TIPC_ADDR_ID
の場合、 v1 がノード、 v2 が参照であり、 v3 を設定する必要があります0に。
タプル
(interface, )
は、 AF_CAN アドレスファミリに使用されます。ここで、 interface は、'can0'
のようなネットワークインターフェイス名を表す文字列です。 ネットワークインターフェイス名は、このファミリのすべてのネットワークインターフェイスからパケットを受信するために使用できます。
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 は、文字列としてのアルゴリズムタイプです。
aead
、hash
、skcipher
、またはrng
。name は、文字列としてのアルゴリズム名と操作モードです。例:
sha256
、hmac(sha256)
、cbc(aes)
、またはdrbg_nopr_ctr_aes256
。feat と mask は符号なし32ビット整数です。
可用性Linux2.6.38、一部のアルゴリズムタイプでは、より新しいカーネルが必要です。
バージョン3.6の新機能。
AF_PACKET は、ネットワークデバイスへの直接の低レベルインターフェイスです。 パケットはタプル
(ifname, proto[, pkttype[, hatype[, addr]]])
で表されます。ここで、ifname -デバイス名を指定する文字列。
proto -イーサネットプロトコル番号を指定するネットワークバイトオーダーの整数。
pkttype -パケットタイプを指定するオプションの整数:
PACKET_HOST
(デフォルト)-ローカルホスト宛てのパケット。PACKET_BROADCAST
-物理層ブロードキャストパケット。PACKET_MULTIHOST
-物理層マルチキャストアドレスに送信されたパケット。PACKET_OTHERHOST
-プロミスキャスモードでデバイスドライバーによってキャッチされた他のホストへのパケット。PACKET_OUTGOING
-パケットソケットにループバックされるローカルホストから発信されたパケット。
hatype -ARPハードウェアアドレスタイプを指定するオプションの整数。
addr -ハードウェアの物理アドレスを指定するオプションのバイトのようなオブジェクト。その解釈はデバイスによって異なります。
IPv4 / v6ソケットアドレスの host 部分でホスト名を使用すると、PythonがDNS解決から返された最初のアドレスを使用するため、プログラムが非決定的な動作を示す場合があります。 ソケットアドレスは、DNS解決やホスト構成の結果に応じて、実際のIPv4 / v6アドレスに異なる方法で解決されます。 決定論的な動作には、 host の部分に数値アドレスを使用します。
すべてのエラーは例外を発生させます。 無効な引数タイプとメモリ不足状態の通常の例外が発生する可能性があります。 Python 3.3以降、ソケットまたはアドレスのセマンティクスに関連するエラーは OSError またはそのサブクラスの1つを発生させます( socket.error を発生させるために使用されていました)。
非ブロッキングモードは、 setblocking()によってサポートされます。 タイムアウトに基づくこれの一般化は、 settimeout()によってサポートされます。
18.1.2。 モジュールの内容
モジュール socket は、次の要素をエクスポートします。
18.1.2.1。 例外
- exception socket.error
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 のサブクラスになりました。
18.1.2.2。 定数
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_STREAM と SOCK_DGRAM のみが一般的に役立つようです。)
- socket.SOCK_CLOEXEC
socket.SOCK_NONBLOCK これらの2つの定数は、定義されている場合、ソケットタイプと組み合わせることができ、いくつかのフラグをアトミックに設定できます(したがって、競合状態の可能性や個別の呼び出しの必要性を回避できます)。
も参照してください
より完全な説明については、安全なファイル記述子の処理。
可用性:Linux> = 2.6.27。
バージョン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_DOMAIN
、SO_PROTOCOL
、SO_PEERSEC
、SO_PASSSEC
、TCP_USER_TIMEOUT
、 [ X92X]を追加しました。バージョン3.6.5で変更: Windowsでは、ランタイムWindowsがサポートしている場合、
TCP_FASTOPEN
、TCP_KEEPCNT
が表示されます。
- socket.AF_CAN
socket.PF_CAN
SOL_CAN_*
CAN_* Linuxのドキュメントに記載されているこれらの形式の定数の多くは、ソケットモジュールでも定義されています。
可用性:Linux> = 2.6.25。
バージョン3.3の新機能。
- socket.CAN_BCM
CAN_BCM_* CANプロトコルファミリのCAN_BCMは、ブロードキャストマネージャ(BCM)プロトコルです。 Linuxのドキュメントに記載されているブロードキャストマネージャー定数も、ソケットモジュールで定義されています。
可用性:Linux> = 2.6.25。
バージョン3.4の新機能。
- socket.CAN_RAW_FD_FRAMES
CAN_RAWソケットでCANFDサポートを有効にします。 これはデフォルトで無効になっています。 これにより、アプリケーションはCANフレームとCANFDフレームの両方を送信できます。 ただし、ソケットから読み取るときは、CANフレームとCANFDフレームの両方を受け入れる必要があります。
この定数は、Linuxのドキュメントに記載されています。
可用性:Linux> = 3.6。
バージョン3.5の新機能。
- socket.AF_PACKET
socket.PF_PACKET
PACKET_* Linuxのドキュメントに記載されているこれらの形式の定数の多くは、ソケットモジュールでも定義されています。
可用性:Linux> = 2.2。
- socket.AF_RDS
socket.PF_RDS
socket.SOL_RDS
RDS_* Linuxのドキュメントに記載されているこれらの形式の定数の多くは、ソケットモジュールでも定義されています。
可用性:Linux> = 2.6.30。
バージョン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カーネル暗号化の定数。
可用性:Linux> = 2.6.38。
バージョン3.6の新機能。
- socket.AF_LINK
可用性:BSD、OSX。
バージョン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では使用できません。
18.1.2.3。 関数
18.1.2.3.1。 ソケットの作成
以下の関数はすべてソケットオブジェクトを作成します。
- 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_
定数のいずれかである必要があります。 プロトコル番号は通常ゼロで省略できます。アドレスファミリが AF_CAN の場合、プロトコルはCAN_RAW
または CAN_BCM のいずれかである必要があります。 fileno が指定されている場合、他の引数は無視され、指定されたファイル記述子を持つソケットが返されます。 socket.fromfd()とは異なり、 fileno は同じソケットを返し、重複は返しません。 これは、 socket.close()を使用して切り離されたソケットを閉じるのに役立つ場合があります。新しく作成されたソケットは継承不可です。
バージョン3.3で変更: AF_CANファミリが追加されました。 AF_RDSファミリが追加されました。
バージョン3.4で変更: CAN_BCMプロトコルが追加されました。
バージョン3.4で変更:返されたソケットは継承できなくなりました。
- 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.fromfd(fd, family, type, proto=0)
ファイル記述子 fd (ファイルオブジェクトの
fileno()
メソッドによって返される整数)を複製し、その結果からソケットオブジェクトを構築します。 アドレスファミリ、ソケットタイプ、およびプロトコル番号は、上記の socket()関数と同じです。 ファイル記述子はソケットを参照する必要がありますが、これはチェックされません。ファイル記述子が無効な場合、オブジェクトに対する後続の操作が失敗する可能性があります。 この関数が必要になることはめったにありませんが、標準の入力または出力としてプログラムに渡されるソケット(Unix inetデーモンによって起動されるサーバーなど)でソケットオプションを取得または設定するために使用できます。 ソケットはブロッキングモードであると見なされます。新しく作成されたソケットは継承不可です。
バージョン3.4で変更:返されたソケットは継承できなくなりました。
- socket.fromshare(data)
socket.share()メソッドから取得したデータからソケットをインスタンス化します。 ソケットはブロッキングモードであると見なされます。
可用性:Windows。
バージョン3.3の新機能。
- socket.SocketType
- これは、ソケットオブジェクトタイプを表すPythonタイプオブジェクトです。
type(socket(...))
と同じです。
18.1.2.3.2。 その他の機能
socket モジュールは、さまざまなネットワーク関連サービスも提供します。
- socket.getaddrinfo(host, port, family=0, type=0, proto=0, flags=0)
host / port 引数を、そのサービスに接続されたソケットを作成するために必要なすべての引数を含む5タプルのシーケンスに変換します。 host はドメイン名であり、IPv4 / v6アドレスまたは
None
の文字列表現です。 port は、'http'
、数値のポート番号、None
などの文字列サービス名です。None
を host および port の値として渡すことにより、NULL
を基盤となるCAPIに渡すことができます。family 、 type 、および proto 引数は、返されるアドレスのリストを絞り込むためにオプションで指定できます。 これらの各引数の値としてゼロを渡すと、結果の全範囲が選択されます。 flags 引数は、
AI_*
定数の1つまたは複数にすることができ、結果の計算方法と返される方法に影響を与えます。 たとえば、AI_NUMERICHOST
はドメイン名の解決を無効にし、 host がドメイン名の場合はエラーを発生させます。この関数は、次の構造を持つ5タプルのリストを返します。
(family, type, proto, canonname, sockaddr)
これらのタプルでは、 family 、 type 、 proto はすべて整数であり、 socket()関数に渡されることを意図しています。 canonname は、
AI_CANONNAME
が flags 引数の一部である場合、 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で変更:パラメータはキーワード引数を使用して渡すことができるようになりました。
- socket.getfqdn([name])
- name の完全修飾ドメイン名を返します。 name が省略されているか空の場合、ローカルホストとして解釈されます。 完全修飾名を見つけるために、 gethostbyaddr()によって返されるホスト名がチェックされ、利用可能な場合はホストのエイリアスが続きます。 ピリオドを含む名が選択されます。 完全修飾ドメイン名が利用できない場合は、 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 は、指定された ip_address に応答するプライマリホスト名です。 aliaslist は、代替の(おそらく空の)リストです。同じアドレスのホスト名。 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)
に変換します。 flags の設定に応じて、結果には host の完全修飾ドメイン名または数値アドレス表現が含まれる場合があります。 同様に、 port には、文字列のポート名または数値のポート番号を含めることができます。
- 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バイトのスワップ操作を実行します。
- socket.htonl(x)
- 32ビットの正の整数をホストからネットワークのバイトオーダーに変換します。 ホストのバイト順序がネットワークのバイト順序と同じであるマシンでは、これは何もしません。 それ以外の場合は、4バイトのスワップ操作を実行します。
- socket.htons(x)
- 16ビットの正の整数をホストからネットワークのバイトオーダーに変換します。 ホストのバイト順序がネットワークのバイト順序と同じであるマシンでは、これは何もしません。 それ以外の場合は、2バイトのスワップ操作を実行します。
- 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()と同様)またはstruct in6_addr
のオブジェクトを呼び出す場合に役立ちます。address_family でサポートされている値は、現在 AF_INET および AF_INET6 です。 IPアドレス文字列 ip_string が無効な場合、 OSError が発生します。 正確に何が有効かは、 address_family の値と
inet_pton()
の基礎となる実装の両方に依存することに注意してください。可用性:Unix(おそらくすべてのプラットフォームではない)、Windows。
バージョン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
のオブジェクトを返す場合に役立ちます。address_family でサポートされている値は、現在 AF_INET および AF_INET6 です。 バイトオブジェクト packed_ip が指定されたアドレスファミリの正しい長さでない場合、 ValueError が発生します。 OSError は、 inet_ntop()の呼び出しからのエラーに対して発生します。
可用性:Unix(おそらくすべてのプラットフォームではない)、Windows。
バージョン3.4で変更: Windowsサポートが追加されました
バージョン3.5で変更:書き込み可能なバイトのようなオブジェクトが受け入れられるようになりました。
- socket.CMSG_LEN(length)
指定された長さの関連データを含む補助データ項目の全長を末尾のパディングなしで返します。 この値は、 recvmsg()が単一の補助データを受信するためのバッファサイズとしてよく使用されますが、 RFC 3542 では、ポータブルアプリケーションで[ 184] CMSG_SPACE()であるため、アイテムがバッファー内の最後になる場合でも、パディング用のスペースが含まれます。 length が許容値の範囲外の場合、 OverflowError を発生させます。
可用性:ほとんどのUnixプラットフォーム、場合によっては他のプラットフォーム。
バージョン3.3の新機能。
- socket.CMSG_SPACE(length)
recvmsg()が、指定された長さの関連データを含む補助データ項目を、末尾のパディングとともに受信するために必要なバッファーサイズを返します。 複数のアイテムを受信するために必要なバッファスペースは、関連するデータ長の CMSG_SPACE()値の合計です。 length が許容値の範囲外の場合、 OverflowError を発生させます。
一部のシステムは、この機能を提供せずに補助データをサポートする場合があることに注意してください。 また、この関数の結果を使用してバッファサイズを設定しても、追加のデータがパディング領域に収まる可能性があるため、受信できる補助データの量が正確に制限されない場合があることに注意してください。
可用性:ほとんどのUnixプラットフォーム、場合によっては他のプラットフォーム。
バージョン3.3の新機能。
- socket.getdefaulttimeout()
- 新しいソケットオブジェクトのデフォルトのタイムアウトを秒単位(float)で返します。
None
の値は、新しいソケットオブジェクトにタイムアウトがないことを示します。 ソケットモジュールが最初にインポートされるとき、デフォルトはNone
です。
- socket.setdefaulttimeout(timeout)
- 新しいソケットオブジェクトのデフォルトのタイムアウトを秒(float)で設定します。 ソケットモジュールが最初にインポートされるとき、デフォルトは
None
です。 可能な値とそれぞれの意味については、 settimeout()を参照してください。
- socket.sethostname(name)
マシンのホスト名を name に設定します。 十分な権限がない場合、これにより OSError が発生します。
可用性:Unix。
バージョン3.3の新機能。
- socket.if_nameindex()
ネットワークインターフェイス情報(インデックスint、名前文字列)タプルのリストを返します。 OSError システムコールが失敗した場合。
可用性:Unix。
バージョン3.3の新機能。
- socket.if_nametoindex(if_name)
インターフェイス名に対応するネットワークインターフェイスインデックス番号を返します。 OSError 指定された名前のインターフェースが存在しない場合。
可用性:Unix。
バージョン3.3の新機能。
- socket.if_indextoname(if_index)
インターフェイスインデックス番号に対応するネットワークインターフェイス名を返します。 OSError 指定されたインデックスのインターフェイスが存在しない場合。
可用性:Unix。
バージョン3.3の新機能。
18.1.3。 ソケットオブジェクト
ソケットオブジェクトには次のメソッドがあります。 makefile()を除いて、これらはソケットに適用可能なUnixシステムコールに対応します。
バージョン3.2で変更: context manager プロトコルのサポートが追加されました。 コンテキストマネージャーを終了することは、 close()を呼び出すことと同じです。
- socket.accept()
接続を受け入れます。 ソケットはアドレスにバインドされ、接続をリッスンする必要があります。 戻り値はペア
(conn, address)
です。ここで、 conn は接続でデータを送受信するために使用できる new ソケットオブジェクトであり、 address は接続のもう一方の端にあるソケットにバインドされているアドレス。新しく作成されたソケットは継承不可です。
バージョン3.4で変更:ソケットは継承できなくなりました。
バージョン3.5で変更:システムコールが中断され、シグナルハンドラが例外を発生させない場合、メソッドは InterruptedError 例外を発生させる代わりに、システムコールを再試行するようになりました([221を参照] ] PEP 475 (理論的根拠)。
- socket.bind(address)
- ソケットをアドレスにバインドします。 ソケットはまだバインドされていない必要があります。 ( address の形式は、アドレスファミリによって異なります。上記を参照してください。)
- socket.close()
ソケットを閉じたとマークします。 基盤となるシステムリソース(例: makefile()のすべてのファイルオブジェクトが閉じられると、ファイル記述子)も閉じられます。 これが発生すると、ソケットオブジェクトに対する今後のすべての操作は失敗します。 リモートエンドはそれ以上データを受信しません(キューに入れられたデータがフラッシュされた後)。
ソケットはガベージコレクションされると自動的に閉じられますが、明示的に close()するか、 with ステートメントを使用することをお勧めします。
バージョン3.6で変更:基になる
close()
呼び出しが行われたときにエラーが発生した場合、 OSError が発生するようになりました。ノート
close()は、接続に関連付けられているリソースを解放しますが、必ずしもすぐに接続を閉じるとは限りません。 タイムリーに接続を閉じたい場合は、 close()の前に shutdown()を呼び出してください。
- socket.connect(address)
アドレスのリモートソケットに接続します。 ( address の形式は、アドレスファミリによって異なります。上記を参照してください。)
接続がシグナルによって中断された場合、メソッドは接続が完了するまで待機するか、シグナルハンドラーが例外を発生させず、ソケットがブロックしている、またはソケットにある場合は、タイムアウト時に socket.timeout を発生させます。タイムアウト。 非ブロッキングソケットの場合、接続がシグナルによって中断された場合(またはシグナルハンドラーによって発生した例外)、メソッドは 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.gettimeout()
- ソケット操作に関連するタイムアウトを秒単位(float)で返します。タイムアウトが設定されていない場合は、
None
を返します。 これは、 setblocking()または settimeout()への最後の呼び出しを反映しています。
- socket.ioctl(control, option)
- プラットホーム
ウィンドウズ
ioctl()メソッドは、WSAIoctlシステムインターフェイスへの制限されたインターフェイスです。 詳細については、 Win32ドキュメントを参照してください。
他のプラットフォームでは、汎用の fcntl.fcntl()および fcntl.ioctl()関数を使用できます。 最初の引数としてソケットオブジェクトを受け入れます。
現在、サポートされている制御コードは、
SIO_RCVALL
、SIO_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では、 subprocess.Popen()のストリーム引数など、 makefile()によって作成されたファイルのようなオブジェクトは、ファイル記述子を持つファイルオブジェクトが予期される場所では使用できません。 。
- socket.recv(bufsize[, flags])
ソケットからデータを受信します。 戻り値は、受信したデータを表すバイトオブジェクトです。 一度に受信するデータの最大量は、 bufsize で指定されています。 オプションの引数 flags の意味については、Unixのマニュアルページ recv(2)を参照してください。 デフォルトはゼロです。
ノート
ハードウェアおよびネットワークの現実と最適に一致させるには、 bufsize の値を2の比較的小さい累乗、たとえば4096にする必要があります。
バージョン3.5で変更:システムコールが中断され、シグナルハンドラが例外を発生させない場合、メソッドは InterruptedError 例外を発生させる代わりに、システムコールを再試行するようになりました([221を参照] ] PEP 475 (理論的根拠)。
- socket.recvfrom(bufsize[, flags])
ソケットからデータを受信します。 戻り値はペア
(bytes, address)
です。ここで、 bytes は受信したデータを表すバイトオブジェクトであり、 address はデータを送信するソケットのアドレスです。 オプションの引数 flags の意味については、Unixのマニュアルページ recv(2)を参照してください。 デフォルトはゼロです。 ( address の形式は、アドレスファミリによって異なります。上記を参照してください。)バージョン3.5で変更:システムコールが中断され、シグナルハンドラが例外を発生させない場合、メソッドは InterruptedError 例外を発生させる代わりに、システムコールを再試行するようになりました([221を参照] ] PEP 475 (理論的根拠)。
- 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 は、新しいファイル記述子をネイティブCint
タイプのバイナリ配列として表す 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.fromstring(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) return msg, list(fds)
可用性:ほとんどのUnixプラットフォーム、場合によっては他のプラットフォーム。
バージョン3.3の新機能。
バージョン3.5で変更:システムコールが中断され、シグナルハンドラが例外を発生させない場合、メソッドは InterruptedError 例外を発生させる代わりに、システムコールを再試行するようになりました([221を参照] ] 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---')]
可用性:ほとんどのUnixプラットフォーム、場合によっては他のプラットフォーム。
バージョン3.3の新機能。
- socket.recvfrom_into(buffer[, nbytes[, flags]])
- ソケットからデータを受信し、新しいバイト文字列を作成する代わりに buffer に書き込みます。 戻り値はペア
(nbytes, address)
です。ここで、 nbytes は受信したバイト数であり、 address はデータを送信するソケットのアドレスです。 オプションの引数 flags の意味については、Unixのマニュアルページ recv(2)を参照してください。 デフォルトはゼロです。 ( address の形式は、アドレスファミリによって異なります。上記を参照してください。)
- socket.recv_into(buffer[, nbytes[, flags]])
- ソケットから最大 nbytes バイトを受信し、新しいバイト文字列を作成するのではなく、データをバッファに格納します。 nbytes が指定されていない(または0)場合は、指定されたバッファーで使用可能なサイズまで受信します。 受信したバイト数を返します。 オプションの引数 flags の意味については、Unixのマニュアルページ recv(2)を参照してください。 デフォルトはゼロです。
- socket.send(bytes[, flags])
ソケットにデータを送信します。 ソケットはリモートソケットに接続する必要があります。 オプションの flags 引数は、上記の recv()と同じ意味です。 送信されたバイト数を返します。 アプリケーションは、すべてのデータが送信されたことを確認する責任があります。 一部のデータのみが送信された場合、アプリケーションは残りのデータの配信を試みる必要があります。 このトピックの詳細については、 Socket Programming HOWTO を参照してください。
バージョン3.5で変更:システムコールが中断され、シグナルハンドラが例外を発生させない場合、メソッドは InterruptedError 例外を発生させる代わりに、システムコールを再試行するようになりました([221を参照] ] PEP 475 (理論的根拠)。
- socket.sendall(bytes[, flags])
ソケットにデータを送信します。 ソケットはリモートソケットに接続する必要があります。 オプションの flags 引数は、上記の recv()と同じ意味です。 send()とは異なり、このメソッドは、すべてのデータが送信されるかエラーが発生するまで、バイトからデータを送信し続けます。 成功すると
None
が返されます。 エラーが発生すると、例外が発生し、正常に送信されたデータの量を判別する方法がありません。バージョン3.5で変更:データが正常に送信されるたびにソケットタイムアウトがリセットされなくなりました。 ソケットタイムアウトは、すべてのデータを送信するための最大合計期間になりました。
バージョン3.5で変更:システムコールが中断され、シグナルハンドラが例外を発生させない場合、メソッドは InterruptedError 例外を発生させる代わりに、システムコールを再試行するようになりました([221を参照] ] PEP 475 (理論的根拠)。
- socket.sendto(bytes, address)
socket.sendto(bytes, flags, address) ソケットにデータを送信します。 宛先ソケットはアドレスで指定されているため、ソケットをリモートソケットに接続しないでください。 オプションの flags 引数は、上記の recv()と同じ意味です。 送信されたバイト数を返します。 ( address の形式は、アドレスファミリによって異なります。上記を参照してください。)
バージョン3.5で変更:システムコールが中断され、シグナルハンドラが例外を発生させない場合、メソッドは InterruptedError 例外を発生させる代わりに、システムコールを再試行するようになりました([221を参照] ] 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))])
可用性:ほとんどのUnixプラットフォーム、場合によっては他のプラットフォーム。
バージョン3.3の新機能。
バージョン3.5で変更:システムコールが中断され、シグナルハンドラが例外を発生させない場合、メソッドは InterruptedError 例外を発生させる代わりに、システムコールを再試行するようになりました([221を参照] ] PEP 475 (理論的根拠)。
- socket.sendmsg_afalg([msg, ]*, op[, iv[, assoclen[, flags]]])
AF_ALG ソケット用の sendmsg()の特殊バージョン。 AF_ALG ソケットのモード、IV、AEAD関連データ長およびフラグを設定します。
可用性:Linux> = 2.6.38
バージョン3.6の新機能。
- socket.sendfile(file, offset=0, count=None)
高性能 os.sendfile を使用してEOFに達するまでファイルを送信し、送信された合計バイト数を返します。 file は、バイナリモードで開かれる通常のファイルオブジェクトである必要があります。 os.sendfile が利用できない場合(例: Windows)または file は通常のファイルではありません 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)
と同等です
- socket.settimeout(value)
ソケット操作のブロックにタイムアウトを設定します。 value 引数は、秒を表す非負の浮動小数点数、または
None
にすることができます。 ゼロ以外の値が指定された場合、操作が完了する前にタイムアウト期間値が経過すると、後続のソケット操作でタイムアウト例外が発生します。 ゼロが指定された場合、ソケットは非ブロッキングモードになります。None
を指定すると、ソケットはブロッキングモードになります。詳細については、ソケットタイムアウトに関する注記を参照してください。
- 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 を参照してください)。 値がNone
に設定されている場合、optlen引数が必要です。 これは、optval = NULLおよびoptlen = optlenを指定してsetsockoptC関数を呼び出すのと同じです。バージョン3.5で変更:書き込み可能なバイトのようなオブジェクトが受け入れられるようになりました。
バージョン3.6で変更: setsockopt(level、optname、None、optlen:int)フォームが追加されました。
- socket.shutdown(how)
- 接続の一方または両方の半分をシャットダウンします。 how が
SHUT_RD
の場合、それ以上の受信は許可されません。 how がSHUT_WR
の場合、それ以上の送信は許可されません。 how がSHUT_RDWR
の場合、それ以上の送受信は許可されません。
- socket.share(process_id)
ソケットを複製し、ターゲットプロセスと共有できるように準備します。 ターゲットプロセスには、 process_id を指定する必要があります。 結果のbytesオブジェクトは、何らかの形式のプロセス間通信を使用してターゲットプロセスに渡すことができ、 fromshare()を使用してそこでソケットを再作成できます。 このメソッドが呼び出されると、オペレーティングシステムがすでにターゲットプロセス用にソケットを複製しているため、ソケットを閉じても安全です。
可用性:Windows。
バージョン3.3の新機能。
read()
またはwrite()
のメソッドはないことに注意してください。 代わりに、 recv()および send()を flags 引数なしで使用してください。
ソケットオブジェクトには、 socket コンストラクターに指定された値に対応するこれらの(読み取り専用)属性もあります。
- socket.family
- ソケットファミリ。
- socket.type
- ソケットタイプ。
- socket.proto
- ソケットプロトコル。
18.1.4。 ソケットタイムアウトに関する注意
ソケットオブジェクトは、ブロッキング、非ブロッキング、またはタイムアウトの3つのモードのいずれかになります。 ソケットはデフォルトで常にブロッキングモードで作成されますが、これは setdefaulttimeout()を呼び出すことで変更できます。
- ブロッキングモードでは、操作が完了するか、システムがエラー(接続のタイムアウトなど)を返すまで、操作がブロックされます。
- 非ブロッキングモードでは、操作をすぐに完了できない場合、操作は失敗します(残念ながらシステムに依存するエラーが発生します)。選択の関数を使用して、いつ、どのように操作できるかを知ることができます。ソケットは読み取りまたは書き込みに使用できます。
- タイムアウトモードでは、ソケットに指定されたタイムアウト内に操作を完了できない場合(タイムアウト例外が発生する)、またはシステムがエラーを返した場合、操作は失敗します。
ノート
オペレーティングシステムレベルでは、タイムアウトモードのソケットは内部的に非ブロッキングモードに設定されています。 また、ブロッキングモードとタイムアウトモードは、同じネットワークエンドポイントを参照するファイル記述子とソケットオブジェクト間で共有されます。 この実装の詳細は、たとえば次の場合に目に見える結果をもたらす可能性があります。 ソケットの fileno()を使用することにしました。
18.1.4.1。 タイムアウトとconnect方法
connect()操作もタイムアウト設定の対象であり、一般に、 connect()を呼び出す前に settimeout()を呼び出すか、 create_connection()へのタイムアウトパラメータ。 ただし、システムネットワークスタックは、Pythonソケットのタイムアウト設定に関係なく、独自の接続タイムアウトエラーを返す場合もあります。
18.1.4.2。 タイムアウトとaccept方法
getdefaulttimeout()が None でない場合、 accept()メソッドによって返されるソケットはそのタイムアウトを継承します。 それ以外の場合、動作はリスニングソケットの設定によって異なります。
- リスニングソケットがブロッキングモードまたはタイムアウトモードの場合、 accept()によって返されるソケットはブロッキングモードです。
- リスニングソケットが非ブロッキングモードの場合、 accept()によって返されるソケットがブロッキングモードであるか非ブロッキングモードであるかは、オペレーティングシステムによって異なります。 クロスプラットフォームの動作を保証したい場合は、この設定を手動でオーバーライドすることをお勧めします。
18.1.5。 例
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の基本的なソケットインターフェイス拡張機能を参照することをお勧めします。