socket
--- 低水準ネットワークインターフェース¶
ソースコード:Lib/socket.py
このモジュールはBSDのソケット(socket) インターフェイスへのアクセスを提供します。これは、近代的なUnixシステム、Windows、MacOS、その他多くのプラットフォームで動作します。
注釈
いくつかの挙動はプラットフォームに依存します。オペレーティングシステムのソケットAPIを呼び出しているためです。
Availability: 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)
の4 要素のタプルが利用されます。flowinfo とscopeid はそれぞれC言語のstructsockaddr_in6
のsin6_flowinfo
とsin6_scope_id
メンバーを表します。socket
モジュールのメソッドでは、後方互換性のためにflowinfo とscope_id の省略を許しています。しかし、scope_id を省略すると scope された IPv6 アドレスを操作するときに問題が起こる場合があることに注意してください。バージョン 3.7 で変更:Для багатоадресних адрес (зі значеннямscope_id)address не може містити частину
%scope_id
(абоzoneid
). Ця інформація є зайвою, і її можна сміливо опустити (рекомендовано).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 はポート番号下位(lower port number)、v3 はポート番号上位(upper port number) です。addr_type が
TIPC_ADDR_ID
の場合、v1 はノード、v2 は参照、v3 は0であるべきです。
AF_CAN
アドレスファミリーには(interface,)
というタプルを利用します。interface は'can0'
のようなネットワークインターフェース名を表す文字列です。このファミリーの全てのネットワークインターフェースからパケットを受信するために、ネットワークインターフェース名''
を利用できます。Протокол
CAN_ISOTP
вимагає кортеж(interface,rx_addr,tx_addr)
, де обидва додаткові параметри є довгим цілим числом без знаку, що представляє ідентифікатор CAN (стандартний або розширений).Протокол
CAN_J1939
вимагає кортеж(interface,name,pgn,addr)
, де додаткові параметри є 64-розрядним цілим числом без знака, що представляє назву ECU, 32-розрядним цілим числом без знака, що представляє номер групи параметрів (PGN ) і 8-бітове ціле число, що представляє адресу.
文字列またはタプル
(id,unit)
はPF_SYSTEM
ファミリーのSYSPROTO_CONTROL
プロトコルのために使用されます。この文字列は、動的に割り当てられたIDによるカーネルコントロールの名前です。このタプルは、カーネルコントロールのIDとユニット番号が既知の場合、または登録済みIDが使用中の場合に使用することができます。Added in version 3.3.
AF_BLUETOOTH
は以下のプロトコルとアドレスフォーマットをサポートしています。BTPROTO_L2CAP
accepts(bdaddr,psm)
wherebdaddr
isthe Bluetooth address as a string andpsm
is an integer.BTPROTO_RFCOMM
は(bdaddr,channel)
を受け取ります。bdaddr
は Bluetooth アドレスを表す文字列で、channel
は整数です。BTPROTO_HCI
accepts a format that depends on your OS.On Linux it accepts a tuple
(device_id,)
wheredevice_id
is an integer specifying the number of the Bluetooth device.On FreeBSD, NetBSD and DragonFly BSD it accepts
bdaddr
wherebdaddr
is the Bluetooth address as a string.
バージョン 3.2 で変更:NetBSD と DragonFlyBSD のサポートが追加されました。
バージョン 3.13.3 で変更:FreeBSD support added.
BTPROTO_SCO
acceptsbdaddr
wherebdaddr
isthe Bluetooth address as a string or abytes
object.(ex.'12:23:34:45:56:67'
orb'12:23:34:45:56:67'
)This protocol is not supported under 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 ビットの整数です。
Availability: Linux >= 2.6.38.
一部のアルゴリズムタイプでは、さらに新しいカーネルが必要です。
Added in version 3.6.
AF_VSOCK
дозволяє спілкуватися між віртуальними машинами та їх хостами. Сокети представлені як кортеж(CID,порт)
, де ідентифікатор контексту або CID і порт є цілими числами.Availability: Linux >= 3.9
Seevsock(7)
Added in version 3.7.
AF_PACKET
is a low-level interface directly to network devices.The addresses are represented by the tuple(ifname,proto[,pkttype[,hatype[,addr]]])
where:ifname - デバイス名を指定する文字列。
proto - The Ethernet protocol number.May be
ETH_P_ALL
to capture all protocols,one of theETHERTYPE_* constantsor any other Ethernet protocol number.pkttype - パケットタイプを指定するオプションの整数:
PACKET_HOST
(за замовчуванням) - пакет, адресований локальному хосту.PACKET_BROADCAST
- широкомовний пакет фізичного рівня.PACKET_MULTICAST
- Packet sent to a physical-layer multicast address.PACKET_OTHERHOST
- Пакет до іншого хосту, який був перехоплений драйвером пристрою в безладному режимі.PACKET_OUTGOING
– Пакет, що надходить від локального хосту і повертається до сокета пакета.
hatype – додаткове ціле число, що визначає тип апаратної адреси ARP.
addr – необов’язковий байтовий об’єкт, що вказує апаратну фізичну адресу, інтерпретація якої залежить від пристрою.
Availability: Linux >= 2.2.
AF_QIPCRTR
— це інтерфейс на основі сокетів лише для Linux для зв’язку зі службами, що працюють на співпроцесорах на платформах Qualcomm. Сімейство адрес представлено як кортеж(вузол,порт)
, девузол іпорт є невід’ємними цілими числами.Availability: Linux >= 4.7.
Added in version 3.8.
IPPROTO_UDPLITE
— це варіант UDP, який дозволяє вказати, яку частину пакету охоплює контрольна сума. Він додає два варіанти розеток, які ви можете змінити.self.setsockopt(IPPROTO_UDPLITE,UDPLITE_SEND_CSCOV,length)
змінить частину вихідних пакетів, охоплених контрольною сумою, аself.setsockopt(IPPROTO_UDPLITE,UDPLITE_RECV_CSCOV,length)
відфільтровує пакети, які покривають занадто мало їхні дані. В обох випадкахдовжина
має бути вдіапазоні(8,2**16,8)
.Такий сокет має бути створений за допомогою
socket(AF_INET,SOCK_DGRAM,IPPROTO_UDPLITE)
для IPv4 абоsocket(AF_INET6,SOCK_DGRAM,IPPROTO_UDPLITE)
для IPv6.Availability: Linux >= 2.6.20, FreeBSD >= 10.1
Added in version 3.9.
AF_HYPERV
is a Windows-only socket based interface for communicatingwith Hyper-V hosts and guests. The address family is represented as a(vm_id,service_id)
tuple where thevm_id
andservice_id
areUUID strings.The
vm_id
is the virtual machine identifier or a set of known VMID valuesif the target is not a specific virtual machine. Known VMID constantsdefined onsocket
are:HV_GUID_ZERO
HV_GUID_BROADCAST
HV_GUID_WILDCARD
- Used to bind on itself and accept connections fromall partitions.HV_GUID_CHILDREN
- Used to bind on itself and accept connection fromchild partitions.HV_GUID_LOOPBACK
- Used as a target to itself.HV_GUID_PARENT
- When used as a bind accepts connection from the parentpartition. When used as an address target it will connect to the parent partition.
The
service_id
is the service identifier of the registered service.Added in version 3.12.
IPv4/v6ソケットのhost 部にホスト名を指定すると、処理結果が一定ではない場合があります。これはPythonはDNSから取得したアドレスのうち最初のアドレスを使用するので、 DNSの処理やホストの設定によって異なるIPv4/6アドレスを取得する場合があるためです。常に同じ結果が必要であれば、host に数値のアドレスを指定してください。
エラー時には例外が発生します。引数型のエラーやメモリ不足の場合には通常の例外が発生し、ソケットやアドレス関連のエラーの場合はOSError
またはそのサブクラスが発生します。
setblocking()
メソッドで、非ブロッキングモードを使用することができます。また、より汎用的にsettimeout()
メソッドでタイムアウトを指定する事ができます。
モジュールの内容¶
socket
モジュールは以下の要素を公開しています。
例外¶
- exceptionsocket.herror¶
OSError
のサブクラス。この例外はアドレス関連のエラー、つまりgethostbyname_ex()
とgethostbyaddr()
などの、 POSIX C API のh_errno を利用する関数のために利用されます。例外に付随する(h_errno,string)
ペアはライブラリの呼び出しによって返されたエラーを表します。h_errno は数値で、string は、hstrerror()
C関数によって返されるh_errno を説明する文字列です。バージョン 3.3 で変更:このクラスは
OSError
のサブクラスになりました。
- exceptionsocket.gaierror¶
A subclass of
OSError
, this exception is raised foraddress-related errors bygetaddrinfo()
andgetnameinfo()
.The accompanying value is a pair(error,string)
representing an errorreturned by a library call.string represents the description oferror, as returned by thegai_strerror()
C function. Thenumericerror value will match one of theEAI_*
constantsdefined in this module.バージョン 3.3 で変更:このクラスは
OSError
のサブクラスになりました。
- exceptionsocket.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¶
These constants represent the address (and protocol) families, used for thefirst argument to
socket()
. If theAF_UNIX
constant is notdefined then this protocol is unsupported. More constants may be availabledepending on the system.
- socket.AF_UNSPEC¶
AF_UNSPEC
means thatgetaddrinfo()
should return socket addresses for anyaddress family (either IPv4, IPv6, or any other) that can be used.
- socket.SOCK_STREAM¶
- socket.SOCK_DGRAM¶
- socket.SOCK_RAW¶
- socket.SOCK_RDM¶
- socket.SOCK_SEQPACKET¶
These constants represent the socket types, used for the second argument to
socket()
. More constants may be available depending on the system.(OnlySOCK_STREAM
andSOCK_DGRAM
appear to be generallyuseful.)
- socket.SOCK_CLOEXEC¶
- socket.SOCK_NONBLOCK¶
この2つの定数が定義されていた場合、ソケットタイプと組み合わせていくつかの flags をアトミックに設定することができます (別の呼び出しを不要にして競合状態を避ける事ができます)。
参考
より完全な説明はSecure File Descriptor Handling を参照してください。
Availability: Linux >= 2.6.27.
Added in version 3.2.
- SO_*
- socket.SOMAXCONN¶
- MSG_*
- SOL_*
- SCM_*
- IPPROTO_*
- IPPORT_*
- INADDR_*
- IP_*
- IPV6_*
- EAI_*
- AI_*
- NI_*
- TCP_*
Many constants of these forms, documented in the Unix documentation on socketsand/or the IP protocol, are also defined in the socket module. They aregenerally used in arguments to the
setsockopt()
andgetsockopt()
methods of socket objects. In most cases, only those symbols that are definedin the Unix header files are defined; for a few symbols, default values areprovided.バージョン 3.6 で変更:
SO_DOMAIN
,SO_PROTOCOL
,SO_PEERSEC
,SO_PASSSEC
,TCP_USER_TIMEOUT
,TCP_CONGESTION
が追加されました。バージョン 3.6.5 で変更:On Windows,
TCP_FASTOPEN
,TCP_KEEPCNT
appear if run-time Windowssupports.バージョン 3.7 で変更:
TCP_NOTSENT_LOWAT
が追加されました。On Windows,
TCP_KEEPIDLE
,TCP_KEEPINTVL
appear if run-time Windowssupports.バージョン 3.10 で変更:
IP_RECVTOS
was added. AddedTCP_KEEPALIVE
. On MacOS this constant can be used in the same way thatTCP_KEEPIDLE
is used on Linux.バージョン 3.11 で変更:Added
TCP_CONNECTION_INFO
. On MacOS this constant can be used in thesame way thatTCP_INFO
is used on Linux and BSD.バージョン 3.12 で変更:Added
SO_RTABLE
andSO_USER_COOKIE
. On OpenBSDand FreeBSD respectively those constants can be used in the same way thatSO_MARK
is used on Linux. Also added missing TCP socket options fromLinux: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
.AddedIP_PKTINFO
,IP_UNBLOCK_SOURCE
,IP_BLOCK_SOURCE
,IP_ADD_SOURCE_MEMBERSHIP
,IP_DROP_SOURCE_MEMBERSHIP
.バージョン 3.13 で変更:Added
SO_BINDTOIFINDEX
. On Linux this constant can be used in thesame way thatSO_BINDTODEVICE
is used, but with the index of anetwork interface instead of its name.
- socket.AF_CAN¶
- socket.PF_CAN¶
- SOL_CAN_*
- CAN_*
Linux ドキュメントにあるこの形式の定数は socket モジュールでも定義されています。
Availability: Linux >= 2.6.25, NetBSD >= 8.
Added in version 3.3.
バージョン 3.11 で変更:NetBSD サポートが追加されました。
バージョン 3.13.4 で変更:Restored missing
CAN_RAW_ERR_FILTER
on Linux.
- socket.CAN_BCM¶
- CAN_BCM_*
CANプロトコルファミリーのCAN_BCMは、ブロードキャストマネージャー(BCM)プロトコルです。Linuxドキュメントにあるこの形式の定数は、socketモジュールでも定義されています。
Availability: 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 のドキュメンテーションで説明されています。
Availability: Linux >= 3.6.
Added in version 3.5.
- socket.CAN_RAW_JOIN_FILTERS¶
Об’єднує застосовані фільтри CAN, щоб у простір користувача передавалися лише кадри CAN, які відповідають усім наданим фільтрам CAN.
この定数は、 Linux のドキュメンテーションで説明されています。
Availability: Linux >= 4.1.
Added in version 3.9.
- socket.CAN_ISOTP¶
CAN_ISOTP у сімействі протоколів CAN є протоколом ISO-TP (ISO 15765-2). Константи ISO-TP, задокументовані в документації Linux.
Availability: Linux >= 2.6.25.
Added in version 3.7.
- socket.CAN_J1939¶
CAN_J1939 у сімействі протоколів CAN є протоколом SAE J1939. Константи J1939, задокументовані в документації Linux.
Availability: Linux >= 5.4.
Added in version 3.9.
- socket.AF_DIVERT¶
- socket.PF_DIVERT¶
These two constants, documented in the FreeBSD divert(4) manual page, arealso defined in the socket module.
Availability: FreeBSD >= 14.0.
Added in version 3.12.
- socket.AF_PACKET¶
- socket.PF_PACKET¶
- PACKET_*
Linux ドキュメントにあるこの形式の定数は socket モジュールでも定義されています。
Availability: Linux >= 2.2.
- socket.ETH_P_ALL¶
ETH_P_ALL
can be used in thesocket
constructor asproto for theAF_PACKET
family in order tocapture every packet, regardless of protocol.For more information, see thepacket(7) manpage.
Availability: Linux.
Added in version 3.12.
- socket.AF_RDS¶
- socket.PF_RDS¶
- socket.SOL_RDS¶
- RDS_*
Linux ドキュメントにあるこの形式の定数は socket モジュールでも定義されています。
Availability: 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 カーネル暗号用の定数です。
Availability: Linux >= 2.6.38.
Added in version 3.6.
- socket.AF_VSOCK¶
- socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID¶
- VMADDR*
- SO_VM*
Константи для зв’язку хост/гость Linux.
Availability: Linux >= 4.8.
Added in version 3.7.
- socket.AF_LINK¶
Availability: BSD, macOS.
Added in version 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¶
For use with
BTPROTO_HCI
.HCI_FILTER
is onlyavailable on Linux and FreeBSD.HCI_TIME_STAMP
andHCI_DATA_DIR
are only available on Linux.
- socket.AF_QIPCRTR¶
Константа для протоколу маршрутизатора IPC Qualcomm, який використовується для зв’язку з віддаленими процесорами, що надають послуги.
Availability: Linux >= 4.7.
- socket.SCM_CREDS2¶
- socket.LOCAL_CREDS¶
- socket.LOCAL_CREDS_PERSISTENT¶
LOCAL_CREDS and LOCAL_CREDS_PERSISTENT can be usedwith SOCK_DGRAM, SOCK_STREAM sockets, equivalent toLinux/DragonFlyBSD SO_PASSCRED, while LOCAL_CREDSsends the credentials at first read, LOCAL_CREDS_PERSISTENTsends for each read, SCM_CREDS2 must be then used forthe latter for the message type.
Added in version 3.11.
Availability: FreeBSD.
- socket.SO_INCOMING_CPU¶
Constant to optimize CPU locality, to be used in conjunction with
SO_REUSEPORT
.Added in version 3.11.
Availability: Linux >= 3.9
- 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¶
Constants for Windows Hyper-V sockets for host/guest communications.
Availability: Windows.
Added in version 3.12.
- socket.ETHERTYPE_ARP¶
- socket.ETHERTYPE_IP¶
- socket.ETHERTYPE_IPV6¶
- socket.ETHERTYPE_VLAN¶
IEEE 802.3 protocol number.constants.
Availability: Linux, FreeBSD, macOS.
Added in version 3.12.
- socket.SHUT_RD¶
- socket.SHUT_WR¶
- socket.SHUT_RDWR¶
These constants are used by the
shutdown()
method of socket objects.Availability: not WASI.
関数¶
ソケットの作成¶
以下の関数は全てsocket object を生成します。
- classsocket.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
を指定した場合は、プロトコル番号には const:CAN_RAW,CAN_BCM
,CAN_ISOTP
,CAN_J1939
のいずれかを指定すべきです。Iffileno is specified, the values forfamily,type, andproto areauto-detected from the specified file descriptor. Auto-detection can beoverruled by calling the function with explicitfamily,type, orprotoarguments. This only affects how Python represents e.g. the return valueof
socket.getpeername()
but not the actual OS resource. Unlikesocket.fromfd()
,fileno will return the same socket and not aduplicate. This may help close a detached socket usingsocket.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 で変更:When
SOCK_NONBLOCK
orSOCK_CLOEXEC
bit flags are applied totype they are cleared, andsocket.type
will not reflect them. They are still passedto the underlying systemsocket()
call. Therefore,sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM|socket.SOCK_NONBLOCK)
усе одно створить неблокуючий сокет в ОС, які підтримують
SOCK_NONBLOCK
, алеsock.type
буде встановлено наsocket.SOCK_STREAM
.バージョン 3.9 で変更:CAN_J1939 プロトコルが追加されました。
バージョン 3.10 で変更:IPPROTO_MPTCP プロトコルが追加されました。
- socket.socketpair([family[,type[,proto]]])¶
Build a pair of connected socket objects using the given address family, sockettype, and protocol number. Address family, socket type, and protocol number areas for the
socket()
function above. The default family isAF_UNIX
if defined on the platform; otherwise, the default isAF_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のデフォルトの動作になります。When a connection cannot be created, an exception is raised. By default,it is the exception from the last address in the list. Ifall_errorsis
True
, it is anExceptionGroup
containing the errors of allattempts.バージョン 3.2 で変更:source_address が追加されました。
バージョン 3.11 で変更:all_errors が追加されました
- socket.create_server(address,*,family=AF_INET,backlog=None,reuse_port=False,dualstack_ipv6=False)¶
Convenience function which creates a TCP socket bound toaddress (a 2-tuple
(host,port)
) and returns the socket object.family should be either
AF_INET
orAF_INET6
.backlog is the queue size passed tosocket.listen()
; if not specified, a default reasonable value is chosen.reuse_port dictates whether to set theSO_REUSEPORT
socket option.Ifdualstack_ipv6 is true,family is
AF_INET6
and the platformsupports it the socket will be able to accept both IPv4 and IPv6 connections,else it will raiseValueError
. Most POSIX platforms and Windows aresupposed to support this functionality.When this functionality is enabled the address returned bysocket.getpeername()
when an IPv4 connection occurs will be an IPv6address represented as an IPv4-mapped IPv6 address.Ifdualstack_ipv6 is false it will explicitly disable this functionalityon platforms that enable it by default (e.g. Linux).This parameter can be used in conjunction withhas_dualstack_ipv6()
:importsocketaddr=("",8080)# all interfaces, port 8080ifsocket.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.Added in version 3.8.
- socket.has_dualstack_ipv6()¶
Повертає
True
, якщо платформа підтримує створення TCP-сокета, який може обробляти з’єднання IPv4 і IPv6.Added in version 3.8.
- socket.fromfd(fd,family,type,proto=0)¶
Duplicate the file descriptorfd (an integer as returned by a file object's
fileno()
method) and build a socket object from the result. Addressfamily, socket type and protocol number are as for thesocket()
functionabove. The file descriptor should refer to a socket, but this is not checked ---subsequent operations on the object may fail if the file descriptor is invalid.This function is rarely needed, but can be used to get or set socket options ona socket passed to a program as standard input or output (such as a serverstarted by the Unix inet daemon). The socket is assumed to be in blocking mode.新たに作成されたソケットは継承不可 です。
バージョン 3.4 で変更:返されるソケットは継承不可になりました。
- socket.fromshare(data)¶
socket.share()
メソッドから取得した data からソケットオブジェクトを生成します。ソケットはブロッキングモードだと仮定されます。Availability: Windows.
Added in version 3.3.
- socket.SocketType¶
ソケットオブジェクトの型を示す型オブジェクト。
type(socket(...))
と同じです。
その他の関数¶
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)¶
This function wraps the C function
getaddrinfo
of the underlying system.host /port 引数の指すアドレス情報を、そのサービスに接続されたソケットを作成するために必要な全ての引数が入った 5 要素のタプルに変換します。host はドメイン名、IPv4/v6アドレスの文字列、または
None
です。port は'http'
のようなサービス名文字列、ポート番号を表す数値、またはNone
です。host とport にNone
を指定すると C APIにNULL
を渡せます。Thefamily,type andproto arguments can be optionally specifiedin order to provide options and limit the list of addresses returned.Pass their default values (
AF_UNSPEC
, 0, and 0, respectively)to not limit the results. See the note below for details.Theflags argument can be one or several of the
AI_*
constants,and will influence how results are computed and returned.For example,AI_NUMERICHOST
will disable domain name resolutionand will raise an error ifhost is a domain name.この関数は以下の構造をとる 5 要素のタプルのリストを返します:
(family,type,proto,canonname,sockaddr)
In these tuples,family,type,proto are all integers and aremeant to be passed to the
socket()
function.canonname will bea string representing the canonical name of thehost ifAI_CANONNAME
is part of theflags argument; elsecanonnamewill be empty.sockaddr is a tuple describing a socket address, whoseformat depends on the returnedfamily (a(address,port)
2-tuple forAF_INET
, a(address,port,flowinfo,scope_id)
4-tuple forAF_INET6
), and is meant to be passed to thesocket.connect()
method.注釈
If you intend to use results from
getaddrinfo()
to create a socket(rather than, for example, retrievecanonname),consider limiting the results bytype (e.g.SOCK_STREAM
orSOCK_DGRAM
) and/orproto (e.g.IPPROTO_TCP
orIPPROTO_UDP
) that your application can handle.The behavior with default values offamily,type,protoandflags is system-specific.
Many systems (for example, most Linux configurations) will return a sortedlist of all matching addresses.These addresses should generally be tried in order until a connection succeeds(possibly tried in parallel, for example, using aHappy Eyeballs algorithm).In these cases, limiting thetype and/orproto can help eliminateunsuccessful or unusable connection attempts.
Some systems will, however, only return a single address.(For example, this was reported on Solaris and AIX configurations.)On these systems, limiting thetype and/orproto helps ensure thatthis address is usable.
引数
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. Якщоім’я опущене або порожнє, воно інтерпретується як локальний хост. Щоб знайти повне ім’я, перевіряється ім’я хоста, яке повертає
gethostbyaddr()
, а потім ідуть псевдоніми хоста, якщо вони доступні. Вибрано перше ім’я, яке містить крапку. Якщо повне доменне ім’я недоступне, а було вказаноім’я, воно повертається без змін. Якщо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
を送出します。Availability: not WASI.
- socket.gethostbyname_ex(hostname)¶
Translate a host name to IPv4 address format, extended interface. Return a3-tuple
(hostname,aliaslist,ipaddrlist)
wherehostname is the host'sprimary host name,aliaslist is a (possiblyempty) list of alternative host names for the same address, andipaddrlist isa list of IPv4 addresses for the same interface on the same host (often but notalways a single address).gethostbyname_ex()
does not support IPv6 nameresolution, andgetaddrinfo()
should be used instead for IPv4/v6 dualstack support.引数
hostname
を指定して監査イベントsocket.gethostbyname
を送出します。Availability: not WASI.
- socket.gethostname()¶
Pythonインタープリタを現在実行しているマシンのホスト名を含む文字列を返します。
引数無しで監査イベント
socket.gethostname
を送出します。注意:
gethostname()
は完全修飾ドメイン名を返すとは限りません。完全修飾ドメイン名が必要であれば、getfqdn()
を使用してください。Availability: not WASI.
- socket.gethostbyaddr(ip_address)¶
Return a 3-tuple
(hostname,aliaslist,ipaddrlist)
wherehostname is theprimary host name responding to the givenip_address,aliaslist is a(possibly empty) list of alternative host names for the same address, andipaddrlist is a list of IPv4/v6 addresses for the same interface on the samehost (most likely containing only a single address). To find the fully qualifieddomain name, use the functiongetfqdn()
.gethostbyaddr()
supportsboth IPv4 and IPv6.引数
ip_address
を指定して監査イベントsocket.gethostbyaddr
を送出します。Availability: not WASI.
- socket.getnameinfo(sockaddr,flags)¶
Translate a socket addresssockaddr into a 2-tuple
(host,port)
. Dependingon the settings offlags, the result can contain a fully qualified domain nameor numeric address representation inhost. Similarly,port can contain astring port name or a numeric port number.Для адрес IPv6
%scope_id
додається до частини хоста, якщоsockaddr містить значимийscope_id. Зазвичай це відбувається для багатоадресних адрес.Для отримання додаткової інформації пропрапори ви можете звернутися доgetnameinfo(3).
引数
sockaddr
を指定して監査イベントsocket.getnameinfo
を送出します。Availability: not WASI.
- socket.getprotobyname(protocolname)¶
Translate an internet protocol name (for example,
'icmp'
) to a constantsuitable for passing as the (optional) third argument to thesocket()
function. This is usually only needed for sockets opened in "raw" mode(SOCK_RAW
); for the normal socket modes, the correct protocol is chosenautomatically if the protocol is omitted or zero.Availability: not WASI.
- socket.getservbyname(servicename[,protocolname])¶
インターネットサービス名とプロトコルから、そのサービスのポート番号を取得します。省略可能なプロトコル名として、
'tcp'
か'udp'
のどちらかを指定することができます。指定がなければどちらのプロトコルにもマッチします。引数
servicename
,protocolname
を指定して監査イベントsocket.getservbyname
を送出します。Availability: not WASI.
- socket.getservbyport(port[,protocolname])¶
インターネットポート番号とプロトコル名から、サービス名を取得します。省略可能なプロトコル名として、
'tcp'
か'udp'
のどちらかを指定することができます。指定がなければどちらのプロトコルにもマッチします。引数
port
,protocolname
を指定して監査イベントsocket.getservbyport
を送出します。Availability: not WASI.
- socket.ntohl(x)¶
32ビットの正の整数のバイトオーダを、ネットワークバイトオーダからホストバイトオーダに変換します。ホストバイトオーダとネットワークバイトオーダが一致するマシンでは、この関数は何もしません。それ以外の場合は4バイトのスワップを行います。
- socket.ntohs(x)¶
16ビットの正の整数のバイトオーダを、ネットワークバイトオーダからホストバイトオーダに変換します。ホストバイトオーダとネットワークバイトオーダが一致するマシンでは、この関数は何もしません。それ以外の場合は2バイトのスワップを行います。
バージョン 3.10 で変更:Raises
OverflowError
ifx does not fit in a 16-bit unsignedinteger.
- socket.htonl(x)¶
32ビットの正の整数のバイトオーダを、ホストバイトオーダからネットワークバイトオーダに変換します。ホストバイトオーダとネットワークバイトオーダが一致するマシンでは、この関数は何もしません。それ以外の場合は4バイトのスワップを行います。
- socket.htons(x)¶
16ビットの正の整数のバイトオーダを、ホストバイトオーダからネットワークバイトオーダに変換します。ホストバイトオーダとネットワークバイトオーダが一致するマシンでは、この関数は何もしません。それ以外の場合は2バイトのスワップを行います。
バージョン 3.10 で変更:Raises
OverflowError
ifx does not fit in a 16-bit unsignedinteger.
- 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()
の実装によって異なります。Availability: 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
が発生します。Availability: Unix, Windows.
バージョン 3.4 で変更:Windowsで利用可能になりました
バージョン 3.5 で変更:書き込み可能なbytes-like object を使用できるようになりました。
- socket.CMSG_LEN(length)¶
指定されたlength にある制御メッセージ(CMSG)から、末尾のパディングを除いた全体の長さを返します。この値は多くの場合、
recvmsg()
が制御メッセージの一連の要素を受信するためのバッファサイズとして使用できますが、バッファの末尾が要素である場合であってもパディングは含まれるので、バッファサイズを取得するにはRFC 3542 で求められているように、CMSG_SPACE()
を使用した移植可能なアプリケーションが必要です。通常length は定数であり、許容範囲外の値が指定された場合はOverflowError
例外が送出されます。Availability: Unix, not WASI.
Unix プラットフォーム。
Added in version 3.3.
- socket.CMSG_SPACE(length)¶
指定されたlength の制御メッセージ(CMSG)の要素を
recvmsg()
が受信するために必要な、パディングを含めたバッファサイズを返します。複数の項目を受信するために必要なバッファスペースは、CMSG_SPACE()
が返すそれぞれの要素の長さの合計です。通常length は定数であり、許容範囲外の値が指定された場合はOverflowError
例外が送出されます。一部のシステムではこの関数を提供せずに制御メッセージをサポートする可能性があることに注意してください。また、この関数の返り値を使用して設定するバッファサイズは、受信する制御メッセージの量を正確に規定しないことがあり、その後に受信するデータがパディング領域に合う場合があることに注意してください。
Availability: Unix, not WASI.
most Unix platforms.
Added in version 3.3.
- socket.getdefaulttimeout()¶
新規に生成されたソケットオブジェクトの、デフォルトのタイムアウト値を浮動小数点形式の秒数で返します。タイムアウトを使用しない場合には
None
を返します。最初に socket モジュールがインポートされた時の初期値はNone
です。
- socket.setdefaulttimeout(timeout)¶
新規に生成されるソケットオブジェクトの、デフォルトのタイムアウト値を秒数 (float 型) で設定します。最初に socket モジュールがインポートされた時の初期値は
None
です。指定可能な値とその意味についてはsettimeout()
メソッドを参照してください。
- socket.sethostname(name)¶
マシンのホスト名をname に設定します。必要な権限がない場合は
OSError
を送出します。引数
name
を指定して監査イベントsocket.sethostname
を送出します。Availability: Unix, not Android.
Added in version 3.3.
- socket.if_nameindex()¶
ネットワークインターフェース情報 (index int, name string)のタプルを返します。システムコールが失敗した場合、
OSError
例外を送出します。Availability: Unix, Windows, not WASI.
Added in version 3.3.
バージョン 3.8 で変更:Windows のサポートが追加されました。
注釈
У Windows мережеві інтерфейси мають різні імена в різних контекстах (усі імена є прикладами):
UUID:
{FB605B73-AAC2-49A6-9A2F-25416AEA0573}
name:
ethernet_32770
зрозуміла назва:
vEthernet(nat)
опис:
Hyper-VVirtualEthernetAdapter
Ця функція повертає імена другої форми зі списку,
ethernet_32770
у цьому прикладі.
- socket.if_nametoindex(if_name)¶
インターフェース名if_name に対応するネットワークインターフェースのインデックス番号を返します。対応するインターフェースが存在しない場合は
OSError
例外を送出します。Availability: Unix, Windows, not WASI.
Added in version 3.3.
バージョン 3.8 で変更:Windows のサポートが追加されました。
参考
"Назва інтерфейсу" — це назва, задокументована в
if_nameindex()
.
- socket.if_indextoname(if_index)¶
インターフェースインデックス番号if_index に対応するネットワークインターフェース名を返します。対応するインターフェースが存在しない場合は
OSError
例外を送出します。Availability: Unix, Windows, not WASI.
Added in version 3.3.
バージョン 3.8 で変更:Windows のサポートが追加されました。
参考
"Назва інтерфейсу" — це назва, задокументована в
if_nameindex()
.
- socket.send_fds(sock,buffers,fds[,flags[,address]])¶
Send the list of file descriptorsfds over an
AF_UNIX
socketsock.Thefds parameter is a sequence of file descriptors.Consultsendmsg()
for the documentation of these parameters.Availability: Unix, not WASI.
Unix platforms supporting
sendmsg()
andSCM_RIGHTS
mechanism.Added in version 3.9.
- socket.recv_fds(sock,bufsize,maxfds[,flags])¶
Receive up tomaxfds file descriptors from an
AF_UNIX
socketsock.Return(msg,list(fds),flags,addr)
.Consultrecvmsg()
for the documentation of these parameters.Availability: Unix, not WASI.
Unix platforms supporting
recvmsg()
andSCM_RIGHTS
mechanism.Added in version 3.9.
注釈
Будь-які скорочені цілі числа в кінці списку дескрипторів файлів.
socket オブジェクト¶
ソケットオブジェクトは以下のメソッドを持ちます。makefile()
以外のメソッドは、Unixのソケット用システムコールに対応しています。
バージョン 3.2 で変更:context manager プロトコルのサポートが追加されました。コンテキストマネージャを終了することは、close()
を呼ぶことと同一です。
- socket.accept()¶
接続を受け付けます。ソケットはアドレスにbind済みで、listen中である必要があります。戻り値は
(conn,address)
のペアで、conn は接続を通じてデータの送受信を行うための新しい ソケットオブジェクト、address は接続先でソケットにbindしているアドレスを示します。新たに作成されたソケットは継承不可 です。
バージョン 3.4 で変更:ソケットが継承不可 になりました。
バージョン 3.5 で変更:システムコールが中断されシグナルハンドラが例外を送出しなかった場合、このメソッドは
InterruptedError
例外を送出する代わりにシステムコールを再試行するようになりました (論拠についてはPEP 475 を参照してください)。
- socket.bind(address)¶
ソケットをaddress にbindします。bind済みのソケットを再バインドする事はできません。(address のフォーマットはアドレスファミリによって異なります -- 前述。)
引数
self
,address
を指定して監査イベントsocket.bind
を送出します。Availability: not WASI.
- socket.close()¶
Mark the socket closed. The underlying system resource (e.g. a filedescriptor) is also closed when all file objects from
makefile()
are closed. Once that happens, all future operations on the socketobject will fail. The remote end will receive no more data (afterqueued data is flushed).ソケットはガベージコレクション時に自動的にクローズされます。しかし、明示的に
close()
するか、with
文の中でソケットを使うことを推奨します。バージョン 3.6 で変更:下層の
close()
が呼び出される時、OSError
が送出されるようになりました。注釈
close()
releases the resource associated with a connection butdoes not necessarily close the connection immediately. If you wantto close the connection in a timely fashion, callshutdown()
beforeclose()
.
- socket.connect(address)¶
address で示されるリモートソケットに接続します。(address のフォーマットはアドレスファミリによって異なります --- 前述。)
接続が信号によって中断された場合、このメソッドは接続が完了するまで待機するか、タイムアウト時に
TimeoutError
を送出します。タイムアウトは、信号ハンドラが例外を送出せず、ソケットがブロックするかタイムアウトが設定されている場合に起こります。非ブロックソケットでは、接続が信号によって中断された場合 (あるいは信号ハンドラにより例外が送出された場合)、このメソッドはInterruptedError
例外を送出します。引数
self
,address
を指定して監査イベントsocket.connect
を送出します。バージョン 3.5 で変更:このメソッドは、接続が信号によって中断され、信号ハンドラが例外を送出せず、ソケットがブロックであるかタイムアウトが設定されている場合、
InterruptedError
例外を送出する代わりに、接続を完了するまで待機するようになりました (論拠についてはPEP 475 を参照してください)。Availability: not WASI.
- socket.connect_ex(address)¶
connect(address)
と同様ですが、C言語のconnect()
関数の呼び出しでエラーが発生した場合には例外を送出せずにエラーを戻り値として返します。(これ以外の、"host not found,"等のエラーの場合には例外が発生します。)処理が正常に終了した場合には0
を返し、エラー時にはerrno
の値を返します。この関数は、非同期接続をサポートする場合などに使用することができます。引数
self
,address
を指定して監査イベントsocket.connect
を送出します。Availability: not WASI.
- socket.detach()¶
実際にファイル記述子を閉じることなく、ソケットオブジェクトを閉じた状態にします。ファイル記述子は返却され、他の目的に再利用することができます。
Added in version 3.2.
- socket.dup()¶
ソケットを複製します。
新たに作成されたソケットは継承不可 です。
バージョン 3.4 で変更:ソケットが継承不可 になりました。
Availability: not WASI.
- socket.fileno()¶
ソケットのファイル記述子を短い整数型で返します。失敗時には、-1 を返します。ファイル記述子は、
select.select()
などで使用します。Windowsではこのメソッドで返された小整数をファイル記述子を扱う箇所 (
os.fdopen()
など) で利用できません。 Unix にはこの制限はありません。
- socket.get_inheritable()¶
ソケットのファイル記述子またはソケットのハンドルの継承可能フラグ を取得します。ソケットが子プロセスへ継承可能なら
True
、継承不可ならFalse
を返します。Added in version 3.4.
- socket.getpeername()¶
ソケットが接続しているリモートアドレスを返します。この関数は、リモート IPv4/v6ソケットのポート番号を調べる場合などに使用します。address のフォーマットはアドレスファミリによって異なります(前述)。この関数をサポートしていないシステムも存在します。
- socket.getsockname()¶
ソケット自身のアドレスを返します。この関数は、IPv4/v6ソケットのポート番号を調べる場合などに使用します。(address のフォーマットはアドレスファミリによって異なります --- 前述。)
- socket.getsockopt(level,optname[,buflen])¶
Return the value of the given socket option (see the Unix man pagegetsockopt(2)). The needed symbolic constants (SO_* etc.)are defined in this module. Ifbuflen is absent, an integer option is assumedand its integer value is returned by the function. Ifbuflen is present, itspecifies the maximum length of the buffer used to receive the option in, andthis buffer is returned as a bytes object. It is up to the caller to decode thecontents of the buffer (see the optional built-in module
struct
for a wayto decode C structures encoded as byte strings).Availability: not WASI.
- socket.getblocking()¶
Повертає
True
, якщо сокет знаходиться в режимі блокування,False
, якщо він не блокується.This is equivalent to checking
socket.gettimeout()!=0
.Added in version 3.7.
- socket.gettimeout()¶
ソケットに指定されたタイムアウト値を取得します。タイムアウト値が設定されている場合には浮動小数点型で秒数が、設定されていなければ
None
が返ります。この値は、最後に呼び出されたsetblocking()
またはsettimeout()
によって設定されます。
- socket.ioctl(control,option)¶
- Platform:
Windows
ioctl()
メソッドは WSAIoctl システムインターフェースへの制限されたインターフェースです。詳しい情報については、Win32 documentation を参照してください。他のプラットフォームでは一般的な
fcntl.fcntl()
とfcntl.ioctl()
が使われるでしょう; これらの関数は第 1 引数としてソケットオブジェクトを取ります。現在、以下のコントロールコードのみがサポートされています。
SIO_RCVALL
,SIO_KEEPALIVE_VALS
,SIO_LOOPBACK_FAST_PATH
。バージョン 3.6 で変更:
SIO_LOOPBACK_FAST_PATH
が追加されました。
- socket.listen([backlog])¶
サーバーを有効にして、接続を受け付けるようにします。backlog が指定されている場合、少なくとも 0 以上でなければなりません (それより低い場合、0 に設定されます)。システムが新しい接続を拒否するまでに許可する未受付の接続の数を指定します。指定しない場合、デフォルトの妥当な値が選択されます。
Availability: not WASI.
バージョン 3.5 で変更:backlog 引数が任意になりました。
- socket.makefile(mode='r',buffering=None,*,encoding=None,errors=None,newline=None)¶
Return afile object associated with the socket. The exact returnedtype depends on the arguments given to
makefile()
. These arguments areinterpreted the same way as by the built-inopen()
function, exceptthe only supportedmode values are'r'
(default),'w'
,'b'
, ora combination of those.ソケットはブロッキングモードでなければなりません。タイムアウトを設定することはできますが、タイムアウトが発生すると、ファイルオブジェクトの内部バッファが矛盾した状態になることがあります。
makefile()
でファイルオブジェクトにソケットを関連づけた場合、ソケットを閉じるには、関連づけられたすべてのファイルオブジェクトを閉じたあとで、元のソケットのsocket.close()
を呼び出さなければなりません。注釈
Windows では
subprocess.Popen()
の stream 引数などファイルディスクリプタつき file オブジェクトが期待されている場所では、makefile()
によって作成される file-like オブジェクトは使用できません。
- socket.recv(bufsize[,flags])¶
Receive data from the socket. The return value is a bytes object representing thedata received. The maximum amount of data to be received at once is specifiedbybufsize. A returned empty bytes object indicates that the client has disconnected.See the Unix manual pagerecv(2) for the meaning of the optional argumentflags; it defaults to zero.
バージョン 3.5 で変更:システムコールが中断されシグナルハンドラが例外を送出しなかった場合、このメソッドは
InterruptedError
例外を送出する代わりにシステムコールを再試行するようになりました (論拠についてはPEP 475 を参照してください)。
- socket.recvfrom(bufsize[,flags])¶
ソケットからデータを受信し、結果をタプル
(bytes,address)
として返します。bytes は受信データの bytes オブジェクトで、address は送信元のアドレスを示します。オプション引数flags については、 Unix のマニュアルページrecv(2) を参照してください。デフォルトは0です。 (address のフォーマットはアドレスファミリによって異なります(前述))バージョン 3.5 で変更:システムコールが中断されシグナルハンドラが例外を送出しなかった場合、このメソッドは
InterruptedError
例外を送出する代わりにシステムコールを再試行するようになりました (論拠についてはPEP 475 を参照してください)。バージョン 3.7 で変更:Для багатоадресної адреси IPv6 перший елементaddress більше не містить частини
%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 アイテムは、ゼロ以上のタプル(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()
も参照してください。importsocket,arraydefrecv_fds(sock,msglen,maxfds):fds=array.array("i")# Array of intsmsg,ancdata,flags,addr=sock.recvmsg(msglen,socket.CMSG_LEN(maxfds*fds.itemsize))forcmsg_level,cmsg_type,cmsg_datainancdata:ifcmsg_level==socket.SOL_SOCKETandcmsg_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)])returnmsg,list(fds)
Availability: Unix.
Unix プラットフォーム。
Added in version 3.3.
バージョン 3.5 で変更:システムコールが中断されシグナルハンドラが例外を送出しなかった場合、このメソッドは
InterruptedError
例外を送出する代わりにシステムコールを再試行するようになりました (論拠については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、msg_flags、address はrecvmsg()
と同様です。以下はプログラム例です:
>>>importsocket>>>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---')]
Availability: Unix.
Unix プラットフォーム。
Added in version 3.3.
- socket.recvfrom_into(buffer[,nbytes[,flags]])¶
ソケットからデータを受信し、そのデータを新しいバイト文字列として返す代わりにbuffer に書きます。戻り値は
(nbytes,address)
のペアで、nbytes は受信したデータのバイト数を、address はデータを送信したソケットのアドレスです。オプション引数flags (デフォルト:0) の意味については、 Unix マニュアルページrecv(2) を参照してください。(address のフォーマットは前述のとおりアドレスファミリーに依存します。)
- socket.recv_into(buffer[,nbytes[,flags]])¶
nbytes バイトまでのデータをソケットから受信して、そのデータを新しいバイト文字列にするのではなくbuffer に保存します。nbytes が指定されない(あるいは0が指定された)場合、buffer の利用可能なサイズまで受信します。受信したバイト数を返り値として返します。オプション引数flags (デフォルト:0) の意味については、 Unix マニュアルページrecv(2) を参照してください。
- socket.send(bytes[,flags])¶
ソケットにデータを送信します。ソケットはリモートソケットに接続済みでなければなりません。オプション引数flags の意味は、上記
recv()
と同じです。戻り値として、送信したバイト数を返します。アプリケーションでは、必ず戻り値をチェックし、全てのデータが送られた事を確認する必要があります。データの一部だけが送信された場合、アプリケーションで残りのデータを再送信してください。ソケットプログラミングHOWTO に、さらに詳しい情報があります。バージョン 3.5 で変更:システムコールが中断されシグナルハンドラが例外を送出しなかった場合、このメソッドは
InterruptedError
例外を送出する代わりにシステムコールを再試行するようになりました (論拠についてはPEP 475 を参照してください)。
- socket.sendall(bytes[,flags])¶
ソケットにデータを送信します。ソケットはリモートソケットに接続済みでなければなりません。オプション引数flags の意味は、上記
recv()
と同じです。send()
と異なり、このメソッドはbytes の全データを送信するか、エラーが発生するまで処理を継続します。正常終了の場合はNone
を返し、エラー発生時には例外が発生します。エラー発生時、送信されたバイト数を調べる事はできません。バージョン 3.5 で変更:ソケットのタイムアウトは、データが正常に送信される度にリセットされなくなりました。ソケットのタイムアウトは、すべてのデータを送る最大の合計時間となります。
バージョン 3.5 で変更:システムコールが中断されシグナルハンドラが例外を送出しなかった場合、このメソッドは
InterruptedError
例外を送出する代わりにシステムコールを再試行するようになりました (論拠についてはPEP 475 を参照してください)。
- socket.sendto(bytes,address)¶
- socket.sendto(bytes,flags,address)
ソケットにデータを送信します。このメソッドでは接続先をaddress で指定するので、接続済みではいけません。オプション引数flags の意味は、上記
recv()
と同じです。戻り値として、送信したバイト数を返します。(address のフォーマットはアドレスファミリによって異なります --- 前述。)引数
self
,address
を指定して監査イベントsocket.sendto
を送出します。バージョン 3.5 で変更:システムコールが中断されシグナルハンドラが例外を送出しなかった場合、このメソッドは
InterruptedError
例外を送出する代わりにシステムコールを再試行するようになりました (論拠についてはPEP 475 を参照してください)。
- socket.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
メカニズムをサポートするシステムで、ファイル記述子fds をAF_UNIX
ソケット経由で送信します。recvmsg()
も参照してください。importsocket,arraydefsend_fds(sock,msg,fds):returnsock.sendmsg([msg],[(socket.SOL_SOCKET,socket.SCM_RIGHTS,array.array("i",fds))])
Availability: Unix, not WASI.
Unix プラットフォーム。
引数
self
,address
を指定して監査イベントsocket.sendmsg
を送出します。Added in version 3.3.
バージョン 3.5 で変更:システムコールが中断されシグナルハンドラが例外を送出しなかった場合、このメソッドは
InterruptedError
例外を送出する代わりにシステムコールを再試行するようになりました (論拠についてはPEP 475 を参照してください)。
- socket.sendmsg_afalg([msg,]*,op[,iv[,assoclen[,flags]]])¶
sendmsg()
のAF_ALG
ソケット用に特化したバージョンです。AF_ALG
ソケットの、モード、IV、AEAD に関連づけられたデータ長、フラグを設定します。Availability: Linux >= 2.6.38.
Added in version 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
タイプでなければなりません。非ブロックソケットはサポートされていません。Added in version 3.5.
- socket.setblocking(flag)¶
ソケットをブロッキングモード、または非ブロッキングモードに設定します。flag が False の場合にはソケットは非ブロッキングモードになり、True の場合にはブロッキングモードになります。
このメソッドは、次の
settimeout()
呼び出しの省略表記です:sock.setblocking(True)
はsock.settimeout(None)
と等価ですsock.setblocking(False)
はsock.settimeout(0.0)
と等価です
バージョン 3.7 で変更:Метод більше не застосовує прапор
SOCK_NONBLOCK
доsocket.type
.
- socket.settimeout(value)¶
Set a timeout on blocking socket operations. Thevalue argument can be anonnegative floating-point number expressing seconds, or
None
.If a non-zero value is given, subsequent socket operations will raise atimeout
exception if the timeout periodvalue has elapsed beforethe operation has completed. If zero is given, the socket is put innon-blocking mode. IfNone
is given, the socket is put in blocking mode.詳しくはソケットタイムアウトの注意事項 を参照してください。
バージョン 3.7 で変更:Метод більше не вмикає прапор
SOCK_NONBLOCK
наsocket.type
.
- socket.setsockopt(level,optname,value:buffer)
- socket.setsockopt(level,optname,None,optlen:int)
Set the value of the given socket option (see the Unix manual pagesetsockopt(2)). The needed symbolic constants are defined in thismodule (SO_* etc. <socket-unix-constants>). The value can be an integer,
None
or abytes-like object representing a buffer. In the latercase it is up to the caller to ensure that the bytestring contains theproper bits (see the optional built-in modulestruct
for a way toencode C structures as bytestrings). Whenvalue is set toNone
,optlen argument is required. It's equivalent to callsetsockopt()
Cfunction withoptval=NULL
andoptlen=optlen
.バージョン 3.5 で変更:書き込み可能なbytes-like object を使用できるようになりました。
バージョン 3.6 で変更:setsockopt(level, optname, None, optlen: int) の形式が追加されました。
Availability: not WASI.
- socket.shutdown(how)¶
接続の片方向、または両方向を切断します。how が
SHUT_RD
の場合、以降は受信を行えません。how がSHUT_WR
の場合、以降は送信を行えません。how がSHUT_RDWR
の場合、以降は送受信を行えません。Availability: not WASI.
- socket.share(process_id)¶
ソケットを複製し、対象のプロセスと共有するための bytes オブジェクトを返します。対象のプロセスをprocess_id で指定しなければなりません。戻り値の bytes オブジェクトは、何らかのプロセス間通信を使って対象のプロセスに伝えます。対象のプロセス側では、
fromshare()
を使って複製されたソケットをとらえます。オペレーティング・システムは対象のプロセスに対してソケットを複製するため、このメソッドを呼び出した後であれば、元のソケットをクローズしても、対象のプロセスに渡ったソケットには影響がありません。Availability: Windows.
Added in version 3.3.
read()
メソッドとwrite()
メソッドは存在しませんので注意してください。代わりにflags を省略したrecv()
とsend()
を使うことができます。
ソケットオブジェクトには以下のsocket
コンストラクタに渡された値に対応した (読み出し専用) 属性があります。
- socket.family¶
ソケットファミリー。
- socket.type¶
ソケットタイプ。
- socket.proto¶
ソケットプロトコル。
ソケットタイムアウトの注意事項¶
ソケットオブジェクトは、ブロッキングモード、非ブロッキングモード、タイムアウトモードのうち、いずれか1つのモードをとります。デフォルトでは、ソケットは常にブロッキングモードで作成されますが、setdefaulttimeout()
で標準のモードを変更することができます。
ブロッキングモード での操作は、完了するか、または(接続がタイムアウトするなどして)システムがエラーを返すまで、ブロックされます。
非ブロッキングモード での操作は、ただちに完了できない場合、例外を送出して失敗します。この場合の例外の種類は、システムに依存するため、ここに記すことができません。
select
モジュールの関数を使って、ソケットの読み書きが利用可能かどうか、可能な場合はいつ利用できるかを調べることができます。タイムアウトモード での操作は、指定されたタイムアウトの時間内に完了しなければ、
timeout
例外を送出します。タイムアウトの時間内にシステムがエラーを返した場合は、そのエラーを返します。
注釈
At the operating system level, sockets intimeout mode are internally setin non-blocking mode. Also, the blocking and timeout modes are shared betweenfile descriptors and socket objects that refer to the same network endpoint.This implementation detail can have visible consequences if e.g. you decideto use thefileno()
of a socket.
タイムアウトとconnect
メソッド¶
connect()
もタイムアウト設定に従います。一般的に、settimeout()
をconnect()
の前に呼ぶか、create_connection()
にタイムアウト引数を渡すことが推奨されます。ただし、システムのネットワークスタックが Python のソケットタイムアウトの設定を無視して、自身の接続タイムアウトエラーを返すこともあります。
タイムアウトとaccept
メソッド¶
getdefaulttimeout()
がNone
でない場合、accept()
メソッドが返すソケットでは、そのタイムアウトが継承されます。None
である場合、待機中のソケットの設定によって動作は異なります。
使用例¶
Here are four minimal example programs using the TCP/IP protocol: a server thatechoes all data that it receives back (servicing only one client), and a clientusing it. Note that a server must perform the sequencesocket()
,bind()
,listen()
,accept()
(possiblyrepeating theaccept()
to service more than one client), while aclient only needs the sequencesocket()
,connect()
. Alsonote that the server does notsendall()
/recv()
onthe socket it is listening on but on the new socket returned byaccept()
.
次のクライアントとサーバは、IPv4 のみをサポートしています。
# Echo server programimportsocketHOST=''# Symbolic name meaning all available interfacesPORT=50007# Arbitrary non-privileged portwithsocket.socket(socket.AF_INET,socket.SOCK_STREAM)ass:s.bind((HOST,PORT))s.listen(1)conn,addr=s.accept()withconn:print('Connected by',addr)whileTrue:data=conn.recv(1024)ifnotdata:breakconn.sendall(data)
# Echo client programimportsocketHOST='daring.cwi.nl'# The remote hostPORT=50007# The same port as used by the serverwithsocket.socket(socket.AF_INET,socket.SOCK_STREAM)ass:s.connect((HOST,PORT))s.sendall(b'Hello, world')data=s.recv(1024)print('Received',repr(data))
The next two examples are identical to the above two, but support both IPv4 andIPv6. The server side will listen to the first address family available (itshould listen to both instead). On most of IPv6-ready systems, IPv6 will takeprecedence and the server may not accept IPv4 traffic. The client side will tryto connect to all the addresses returned as a result of the name resolution, andsends traffic to the first one connected successfully.
# Echo server programimportsocketimportsysHOST=None# Symbolic name meaning all available interfacesPORT=50007# Arbitrary non-privileged ports=Noneforresinsocket.getaddrinfo(HOST,PORT,socket.AF_UNSPEC,socket.SOCK_STREAM,0,socket.AI_PASSIVE):af,socktype,proto,canonname,sa=restry:s=socket.socket(af,socktype,proto)exceptOSErrorasmsg:s=Nonecontinuetry:s.bind(sa)s.listen(1)exceptOSErrorasmsg:s.close()s=NonecontinuebreakifsisNone:print('could not open socket')sys.exit(1)conn,addr=s.accept()withconn:print('Connected by',addr)whileTrue:data=conn.recv(1024)ifnotdata:breakconn.send(data)
# Echo client programimportsocketimportsysHOST='daring.cwi.nl'# The remote hostPORT=50007# The same port as used by the servers=Noneforresinsocket.getaddrinfo(HOST,PORT,socket.AF_UNSPEC,socket.SOCK_STREAM):af,socktype,proto,canonname,sa=restry:s=socket.socket(af,socktype,proto)exceptOSErrorasmsg:s=Nonecontinuetry:s.connect(sa)exceptOSErrorasmsg:s.close()s=NonecontinuebreakifsisNone:print('could not open socket')sys.exit(1)withs:s.sendall(b'Hello, world')data=s.recv(1024)print('Received',repr(data))
次の例は、Windowsで raw socket を利用して非常にシンプルなネットワークスニファーを書きます。このサンプルを実行するには、インターフェースを操作するための管理者権限が必要です:
importsocket# the public network interfaceHOST=socket.gethostbyname(socket.gethostname())# create a raw socket and bind it to the public interfaces=socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_IP)s.bind((HOST,0))# Include IP headerss.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)# receive all packetss.ioctl(socket.SIO_RCVALL,socket.RCVALL_ON)# receive a packetprint(s.recvfrom(65565))# disabled promiscuous modes.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()
操作 (とそのカウンターパート) を通常通りに使用することができます。
最後の例では、特権が必要になるかもしれません:
importsocketimportstruct# CAN frame packing/unpacking (see 'struct can_frame' in <linux/can.h>)can_frame_fmt="=IB3x8s"can_frame_size=struct.calcsize(can_frame_fmt)defbuild_can_frame(can_id,data):can_dlc=len(data)data=data.ljust(8,b'\x00')returnstruct.pack(can_frame_fmt,can_id,can_dlc,data)defdissect_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' interfaces=socket.socket(socket.AF_CAN,socket.SOCK_RAW,socket.CAN_RAW)s.bind(('vcan0',))whileTrue: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)exceptOSError:print('Error sending CAN frame')try:s.send(build_can_frame(0x01,b'\x01\x02\x03'))exceptOSError:print('Error sending CAN frame')
この例を、ほとんど間を空けずに複数回実行すると、以下のエラーが発生する場合があります:
OSError:[Errno98]Addressalreadyinuse
これは以前の実行がソケットをTIME_WAIT
状態のままにし、すぐには再利用できないことで起こります。
There is asocket
flag to set, in order to prevent this,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 etal,
両書とも 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" を参照してください。