socket — 低階網路介面¶
原始碼:Lib/socket.py
這個模組提供了操作 BSD socket 的介面。這在所有現代 Unix 系統、Windows、MacOS,以及一些其他平台上都可用。
備註
由於是呼叫作業系統的 socket API,某些行為可能會因平台而有所差異。
可用性: not WASI.
此模組在 WebAssembly 平台上不起作用或無法使用。更多資訊請參閱 WebAssembly 平台。
Python 的介面是將 Unix 的系統呼叫和 socket 函式庫介面直接轉換成 Python 的物件導向風格:socket() 函式會回傳一個 socket 物件,這個物件的方法實作了各種 socket 系統呼叫。與 C 語言介面相比,參數型別較為高階:就像 Python 文件操作中的 read() 和 write() 一樣,接收操作時會自動分配緩衝區,而發送操作時的緩衝區長度則是隱含的。
也參考
socketserver模組簡化編寫網路伺服器的類別。
ssl模組對 socket 物件的 TLS/SSL 的包裝器 (wrapper)。
Socket 系列家族¶
Depending on the system and the build options, various socket families are supported by this module.
The address format required by a particular socket object is automatically selected based on the address family specified when the socket object was created. Socket addresses are represented as follows:
The address of an
AF_UNIXsocket bound to a file system node is represented as a string, using the file system encoding and the'surrogateescape'error handler (see PEP 383). An address in Linux's abstract namespace is returned as a bytes-like object with an initial null byte; note that sockets in this namespace can communicate with normal file system sockets, so programs intended to run on Linux may need to deal with both types of address. A string or bytes-like object can be used for either type of address when passing it as an argument.在 3.3 版的變更: Previously,
AF_UNIXsocket paths were assumed to use UTF-8 encoding.在 3.5 版的變更: Writable bytes-like object is now accepted.
A pair
(host, port)is used for theAF_INETaddress family, where host is a string representing either a hostname in internet domain notation like'daring.cwi.nl'or an IPv4 address like'100.50.200.5', and port is an integer.For IPv4 addresses, two special forms are accepted instead of a host address:
''representsINADDR_ANY, which is used to bind to all interfaces, and the string'<broadcast>'representsINADDR_BROADCAST. This behavior is not compatible with IPv6, therefore, you may want to avoid these if you intend to support IPv6 with your Python programs.
For
AF_INET6address family, a four-tuple(host, port, flowinfo, scope_id)is used, where flowinfo and scope_id represent thesin6_flowinfoandsin6_scope_idmembers instruct sockaddr_in6in C. Forsocketmodule methods, flowinfo and scope_id can be omitted just for backward compatibility. Note, however, omission of scope_id can cause problems in manipulating scoped IPv6 addresses.在 3.7 版的變更: For multicast addresses (with scope_id meaningful) address may not contain
%scope_id(orzone id) part. This information is superfluous and may be safely omitted (recommended).AF_NETLINKsocket 會以成對的(pid, groups)來表示。Linux-only support for TIPC is available using the
AF_TIPCaddress family. TIPC is an open, non-IP based networked protocol designed for use in clustered computer environments. Addresses are represented by a tuple, and the fields depend on the address type. The general tuple form is(addr_type, v1, v2, v3 [, scope]), where:addr_type is one of
TIPC_ADDR_NAMESEQ,TIPC_ADDR_NAME, orTIPC_ADDR_ID.scope is one of
TIPC_ZONE_SCOPE,TIPC_CLUSTER_SCOPE, andTIPC_NODE_SCOPE.If addr_type is
TIPC_ADDR_NAME, then v1 is the server type, v2 is the port identifier, and v3 should be 0.If addr_type is
TIPC_ADDR_NAMESEQ, then v1 is the server type, v2 is the lower port number, and v3 is the upper port number.If addr_type is
TIPC_ADDR_ID, then v1 is the node, v2 is the reference, and v3 should be set to 0.
A tuple
(interface, )is used for theAF_CANaddress family, where interface is a string representing a network interface name like'can0'. The network interface name''can be used to receive packets from all network interfaces of this family.CAN_ISOTPprotocol requires a tuple(interface, rx_addr, tx_addr)where both additional parameters are unsigned long integer that represent a CAN identifier (standard or extended).CAN_J1939protocol requires a tuple(interface, name, pgn, addr)where additional parameters are 64-bit unsigned integer representing the ECU name, a 32-bit unsigned integer representing the Parameter Group Number (PGN), and an 8-bit integer representing the address.
A string or a tuple
(id, unit)is used for theSYSPROTO_CONTROLprotocol of thePF_SYSTEMfamily. The string is the name of a kernel control using a dynamically assigned ID. The tuple can be used if ID and unit number of the kernel control are known or if a registered ID is used.在 3.3 版被加入.
AF_BLUETOOTHsupports the following protocols and address formats:BTPROTO_L2CAPaccepts a tuple(bdaddr, psm[, cid[, bdaddr_type]])where:bdaddr是一個指定藍牙位址的字串。psmis an integer specifying the Protocol/Service Multiplexer.cidis an optional integer specifying the Channel Identifier. If not given, defaults to zero.bdaddr_typeis an optional integer specifying the address type; one ofBDADDR_BREDR(default),BDADDR_LE_PUBLIC,BDADDR_LE_RANDOM.
在 3.14 版的變更: 新增
cid和bdaddr_type欄位。BTPROTO_RFCOMMaccepts(bdaddr, channel)wherebdaddris the Bluetooth address as a string andchannelis an integer.BTPROTO_HCIaccepts a format that depends on your OS.On Linux it accepts an integer
device_idor a tuple(device_id, [channel])wheredevice_idspecifies the number of the Bluetooth device, andchannelis an optional integer specifying the HCI channel (HCI_CHANNEL_RAWby default).On FreeBSD, NetBSD and DragonFly BSD it accepts
bdaddrwherebdaddris the Bluetooth address as a string.
在 3.2 版的變更: 加入對 NetBSD 和 DragonFlyBSD 的支援。
在 3.13.3 版的變更: 新增對 FreeBSD 的支援。
在 3.14 版的變更: Added
channelfield.device_idnot packed in a tuple is now accepted.BTPROTO_SCOacceptsbdaddrwherebdaddris the Bluetooth address as a string or abytesobject. (ex.'12:23:34:45:56:67'orb'12:23:34:45:56:67')在 3.14 版的變更: 新增對 FreeBSD 的支援。
AF_ALGis a Linux-only socket based interface to Kernel cryptography. An algorithm socket is configured with a tuple of two to four elements(type, name [, feat [, mask]]), where:type is the algorithm type as string, e.g.
aead,hash,skcipherorrng.name is the algorithm name and operation mode as string, e.g.
sha256,hmac(sha256),cbc(aes)ordrbg_nopr_ctr_aes256.feat and mask are unsigned 32bit integers.
可用性: Linux >= 2.6.38.
Some algorithm types require more recent Kernels.
在 3.6 版被加入.
AF_VSOCKallows communication between virtual machines and their hosts. The sockets are represented as a(CID, port)tuple where the context ID or CID and port are integers.在 3.7 版被加入.
AF_PACKETis a low-level interface directly to network devices. The addresses are represented by the tuple(ifname, proto[, pkttype[, hatype[, addr]]])where:ifname - String specifying the device name.
proto - The Ethernet protocol number. May be
ETH_P_ALLto capture all protocols, one of the ETHERTYPE_* constants or any other Ethernet protocol number.pkttype - Optional integer specifying the packet type:
PACKET_HOST(the default) - Packet addressed to the local host.PACKET_BROADCAST- Physical-layer broadcast packet.PACKET_MULTICAST- Packet sent to a physical-layer multicast address.PACKET_OTHERHOST- Packet to some other host that has been caught by a device driver in promiscuous mode.PACKET_OUTGOING- Packet originating from the local host that is looped back to a packet socket.
hatype - Optional integer specifying the ARP hardware address type.
addr - Optional bytes-like object specifying the hardware physical address, whose interpretation depends on the device.
可用性: Linux >= 2.2.
AF_QIPCRTRis a Linux-only socket based interface for communicating with services running on co-processors in Qualcomm platforms. The address family is represented as a(node, port)tuple where the node and port are non-negative integers.可用性: Linux >= 4.7.
在 3.8 版被加入.
IPPROTO_UDPLITEis a variant of UDP which allows you to specify what portion of a packet is covered with the checksum. It adds two socket options that you can change.self.setsockopt(IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV, length)will change what portion of outgoing packets are covered by the checksum andself.setsockopt(IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV, length)will filter out packets which cover too little of their data. In both caseslengthshould be inrange(8, 2**16, 8).Such a socket should be constructed with
socket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE)for IPv4 orsocket(AF_INET6, SOCK_DGRAM, IPPROTO_UDPLITE)for IPv6.可用性: Linux >= 2.6.20, FreeBSD >= 10.1
在 3.9 版被加入.
AF_HYPERVis a Windows-only socket based interface for communicating with Hyper-V hosts and guests. The address family is represented as a(vm_id, service_id)tuple where thevm_idandservice_idare UUID strings.The
vm_idis the virtual machine identifier or a set of known VMID values if the target is not a specific virtual machine. Known VMID constants defined onsocketare:HV_GUID_ZEROHV_GUID_BROADCASTHV_GUID_WILDCARD- Used to bind on itself and accept connections from all partitions.HV_GUID_CHILDREN- Used to bind on itself and accept connection from child partitions.HV_GUID_LOOPBACK- Used as a target to itself.HV_GUID_PARENT- When used as a bind accepts connection from the parent partition. When used as an address target it will connect to the parent partition.
The
service_idis the service identifier of the registered service.在 3.12 版被加入.
If you use a hostname in the host portion of IPv4/v6 socket address, the program may show a nondeterministic behavior, as Python uses the first address returned from the DNS resolution. The socket address will be resolved differently into an actual IPv4/v6 address, depending on the results from DNS resolution and/or the host configuration. For deterministic behavior use a numeric address in host portion.
All errors raise exceptions. The normal exceptions for invalid argument types
and out-of-memory conditions can be raised. Errors
related to socket or address semantics raise OSError or one of its
subclasses.
Non-blocking mode is supported through setblocking(). A
generalization of this based on timeouts is supported through
settimeout().
模組內容¶
The module socket exports the following elements.
例外¶
- exception socket.herror¶
A subclass of
OSError, this exception is raised for address-related errors, i.e. for functions that use h_errno in the POSIX C API, includinggethostbyname_ex()andgethostbyaddr(). The accompanying value is a pair(h_errno, string)representing an error returned by a library call. h_errno is a numeric value, while string represents the description of h_errno, as returned by thehstrerror()C function.在 3.3 版的變更: This class was made a subclass of
OSError.
- exception socket.gaierror¶
A subclass of
OSError, this exception is raised for address-related errors bygetaddrinfo()andgetnameinfo(). The accompanying value is a pair(error, string)representing an error returned by a library call. string represents the description of error, as returned by thegai_strerror()C function. The numeric error value will match one of theEAI_*constants defined in this module.在 3.3 版的變更: This class was made a subclass of
OSError.
- exception socket.timeout¶
A deprecated alias of
TimeoutError.A subclass of
OSError, this exception is raised when a timeout occurs on a socket which has had timeouts enabled via a prior call tosettimeout()(or implicitly throughsetdefaulttimeout()). The accompanying value is a string whose value is currently always "timed out".在 3.3 版的變更: This class was made a subclass of
OSError.在 3.10 版的變更: This class was made an alias of
TimeoutError.
常數¶
The AF_* and SOCK_* constants are now AddressFamily and
SocketKind IntEnum collections.
在 3.4 版被加入.
- socket.AF_UNIX¶
- socket.AF_INET