socket --- 底层网络接口
源代码: Lib/socket.py
这个模块提供了访问BSD套接字的接口。在所有现代Unix系统、Windows、macOS和其他一些平台上可用。
注解 一些行为可能因平台不同而异,因为调用的是操作系统的套接字API。
这个Python接口是用Python的面向对象风格对Unix系统调用和套接字库接口的直译:函数 socket() 返回一个 套接字对象 ,其方法是对各种套接字系统调用的实现。形参类型一般与C接口相比更高级:例如在Python文件 read() 和 write() 操作中,接收操作的缓冲区分配是自动的,发送操作的缓冲区长度是隐式的。
参见
模块 socketserver
用于简化网络服务端编写的类。
模块 ssl
套接字对象的TLS/SSL封装。
套接字协议族
根据系统以及构建选项,此模块提供了各种套接字协议簇。
特定的套接字对象需要的地址格式将根据此套接字对象被创建时指定的地址族被自动选择。套接字地址表示如下:
一个绑定在文件系统节点上的 AF_UNIX 套接字的地址表示为一个字符串,使用文件系统字符编码和 'surrogateescape' 错误回调方法(see PEP 383)。一个地址在 Linux 的抽象命名空间被返回为带有初始的 null 字节的 字节类对象 ;注意在这个命名空间种的套接字可能与普通文件系统套接字通信,所以打算运行在 Linux 上的程序可能需要解决两种地址类型。当传递为参数时,一个字符串或字节类对象可以用于任一类型的地址。
在 3.3 版更改: 之前,AF_UNIX 套接字路径被假设使用 UTF-8 编码。
在 3.5 版更改: 现在支持可写的 字节类对象。
一对 (host, port) 被用于 AF_INET 地址族,host 是一个表示为互联网域名表示法之内的主机名或者一个 IPv4 地址的字符串,例如 'daring.cwi.nl' 或 '100.50.200.5',port 是一个整数。
对于 IPv4 地址,有两种可接受的特殊形式被用来代替一个主机地址: '' 代表 INADDR_ANY,用来绑定到所有接口;字符串 '<broadcast>' 代表 INADDR_BROADCAST。此行为不兼容 IPv6,因此,如果你的 Python 程序打算支持 IPv6,则可能需要避开这些。
对于 AF_INET6 地址族,使用一个四元组 (host, port, flowinfo, scopeid), flowinfo 和 scopeid 代表了 C 库里 struct sockaddr_in6 中的 sin6_flowinfo 和 sin6_scope_id 成员。 对于 socket 模块中的方法, flowinfo 和 scopeid 可以被省略,只为了向后兼容。注意,scopeid 的省略可能会导致 problems in manipulating scoped IPv6 addresses。
在3.7版更改中:对于多播地址(有意义的作用域ID),地址可能不包含 %scope(或)部分。此信息是多余的,可以安全地省略(推荐)。zone id
AF_NETLINK套接字表示为对。(pid, groups)
使用AF_TIPC 地址族可以获得对TIPC的仅Linux支持。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是表示网络接口名称(如)的字符串 。网络接口名称可用于接收来自该系列所有网络接口的数据包。(interface, )AF_CAN'can0'''
CAN_ISOTP协议需要一个元组 ,其中两个附加参数均为表示CAN标识符(标准或扩展)的无符号长整数。(interface, rx_addr, tx_addr)
字符串或元组用于 该家族的协议。该字符串是使用动态分配的ID的内核控件的名称。如果知道内核控件的ID和单元号或使用已注册的ID,则可以使用元组。(id, unit)SYSPROTO_CONTROLPF_SYSTEM
3.3 新版功能.
AF_BLUETOOTH 支持以下协议和地址格式:
BTPROTO_L2CAP接受where 是蓝牙地址作为字符串,并且是整数。(bdaddr, psm)bdaddrpsm
BTPROTO_RFCOMM接受where 是蓝牙地址作为字符串,并且是整数。(bdaddr, channel)bdaddrchannel
BTPROTO_HCI接受(device_id,)其中device_id是整数或与接口的蓝牙地址的字符串。(这取决于您的操作系统; NetBSD和DragonFlyBSD需要一个蓝牙地址,而其他所有都需要一个整数。)
在 3.2 版更改: NetBSD and DragonFlyBSD support added.
BTPROTO_SCO接受bdaddr其中bdaddr的 bytes对象包含字符串格式的蓝牙地址。(例如。b'12:23:34:45:56:67')FreeBSD不支持该协议。
AF_ALG是内核加密的基于Linux的仅基于套接字的接口。算法套接字配置有两个到四个元素的元组,其中:(type, name [, feat [, mask]])
类型是算法类型为字符串,例如aead,hash, skcipher或rng。
名称是该算法的名称和操作模式为字符串,例如 sha256,hmac(sha256),cbc(aes)或drbg_nopr_ctr_aes256。
feat和mask是无符号的32位整数。
可用性:Linux 2.6.38,某些算法类型需要更新的内核。
3.6 新版功能.
AF_VSOCK允许虚拟机与其主机之间进行通信。套接字表示为元组,其中上下文ID或CID和端口是整数。(CID, port)
可用性:Linux> = 4.8 QEMU> = 2.8 ESX> = 4.0 ESX工作站> = 6.5。
3.7 新版功能.
AF_PACKET是直接连接到网络设备的低级接口。数据包由元组表示, 其中:(ifname, proto[, pkttype[, hatype[, addr]]])
ifname-指定设备名称的字符串。
proto-网络字节序整数,指定以太网协议号。
pkttype-可选整数,指定数据包类型:
PACKET_HOST (默认)-寻址到本地主机的数据包。
PACKET_BROADCAST -物理层广播数据包。
PACKET_MULTIHOST -数据包发送到物理层多播地址。
PACKET_OTHERHOST -混杂到设备驱动程序捕获到的其他主机的数据包。
PACKET_OUTGOING -来自本地主机的数据包,该本地主机环回到数据包套接字。
hatype-可选整数,指定ARP硬件地址类型。
addr-可选的类似字节的对象,指定硬件物理地址,其解释取决于设备。
AF_QIPCRTR是基于Linux的仅基于套接字的接口,用于与在Qualcomm平台上的协处理器上运行的服务进行通信。地址族表示为元组,其中节点和端口 为非负整数。(node, port)
3.8 新版功能.
如果你在 IPv4/v6 套接字地址的 host 部分中使用了一个主机名,此程序可能会表现不确定行为,因为 Python 使用 DNS 解析返回的第一个地址。套接字地址在实际的 IPv4/v6 中以不同方式解析,根据 DNS 解析和/或 host 配置。为了确定行为,在 host 部分中使用数字的地址。
所有的错误都抛出异常。对于无效的参数类型和内存溢出异常情况可能抛出普通异常;从 Python 3.3 开始,与套接字或地址语义有关的错误抛出 OSError 或它的子类之一(常用 socket.error)。
可以用 setblocking() 设置非阻塞模式。一个基于超时的 generalization 通过 settimeout() 支持。
模块内容
socket 模块导出以下元素。
异常
异常socket.error
一个被弃用的 OSError 的别名。
在 3.3 版更改: 根据 PEP 3151,这个类是 OSError 的别名。
异常socket.herror
OSError针对地址相关的错误(即,对于在POSIX C API 中使用h_errno的函数,包括gethostbyname_ex()和)引发的子类,此异常gethostbyaddr()。附带的值是一对,代表由库调用返回的错误。 h_errno是一个数值,而 string表示由C函数返回 的h_errno的描述。(h_errno, string)hstrerror()
在 3.3 版更改: This class was made a subclass of OSError.
异常socket.gaierror
对于的子类OSError,此异常由getaddrinfo()和引发,用于地址相关的错误getnameinfo()。附带的值是一对,代表由库调用返回的错误。 字符串表示对错误的描述, 由C函数返回。数字错误值将与该模块中定义的常数之一匹配。(error, string)gai_strerror()EAI_*
在 3.3 版更改: This class was made a subclass of OSError.
异常socket.timeout
的子类OSError,当套接字上发生超时时引发了此异常,该套接字通过先前的调用settimeout()(或通过隐式 setdefaulttimeout())启用了超时 。附带的值是一个字符串,其值当前始终处于“超时”状态。
在 3.3 版更改: This class was made a subclass of OSError.
常数
AF_ *和SOCK_ *常量现在是AddressFamily和 SocketKind IntEnum集合。
3.4 新版功能.
socket.AF_UNIX
socket.AF_INET
socket.AF_INET6
这些常量表示地址(和协议)系列,用于的第一个参数socket()。如果AF_UNIX未定义常量,则不支持该协议。根据系统,可能会有更多的常量可用。
socket.SOCK_STREAM
socket.SOCK_DGRAM
socket.SOCK_RAW
socket.SOCK_RDM
socket.SOCK_SEQPACKET
这些常量表示套接字类型,用于的第二个参数 socket()。根据系统,可能会有更多的常量可用。(仅SOCK_STREAM并且SOCK_DGRAM似乎通常有用。)
socket.SOCK_CLOEXEC
socket.SOCK_NONBLOCK
这两个常量(如果已定义)可以与套接字类型结合使用,并允许您自动设置一些标志(从而避免可能的争用条件和单独调用的需要)。
参见 安全文件描述符处理 提供了更详尽的解释。
可用性: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, TCP_CONGESTION were added.
在 3.6.5 版更改: On Windows, TCP_FASTOPEN, TCP_KEEPCNT appear if run-time Windows supports.
在 3.7 版更改: TCP_NOTSENT_LOWAT was added.
在Windows上,如果运行时Windows支持TCP_KEEPIDLE,则TCP_KEEPINTVL出现。
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。
注解 该CAN_BCM_CAN_FD_FRAME标志仅在>> 4.8的Linux上可用。
3.4 新版功能.
socket.CAN_RAW_FD_FRAMES
在CAN_RAW套接字中启用CAN FD支持。默认情况下禁用此功能。这使您的应用程序可以发送CAN和CAN FD帧。但是,从套接字读取时,您必须同时接受CAN和CAN FD帧。
该常量在Linux文档中有所记录。
可用性:Linux> = 3.6。
3.5 新版功能.
socket.CAN_ISOTP
CAN协议家族中的CAN_ISOTP是ISO-TP(ISO 15765-2)协议。ISO-TP常数,在Linux文档中记录。
可用性:Linux> = 2.6.25。
3.7 新版功能.
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 was added.
TIPC_*
TIPC相关的常量,与C套接字API导出的常量匹配。有关更多信息,请参见TIPC文档。
socket.AF_ALG
socket.SOL_ALG
ALG_*
Linux内核加密的常量。
可用性:Linux> = 2.6.38。
3.6 新版功能.
socket.AF_VSOCK
socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
VMADDR*
SO_VM*
Linux主机/来宾通信的常量。
可用性:Linux> = 4.8。
3.7 新版功能.
socket.AF_LINK
可用性:BSD,OSX。
3.4 新版功能.
socket.has_ipv6
该常量包含一个布尔值,该值指示此平台上是否支持IPv6。
socket.BDADDR_ANY
socket.BDADDR_LOCAL
这些是包含具有特殊含义的蓝牙地址的字符串常量。例如,BDADDR_ANY当用指定绑定套接字时,可用于指示任何地址 BTPROTO_RFCOMM。
socket.HCI_FILTER
socket.HCI_TIME_STAMP
socket.HCI_DATA_DIR
与一起使用BTPROTO_HCI。HCI_FILTER不适用于NetBSD或DragonFlyBSD。HCI_TIME_STAMP并 HCI_DATA_DIR没有直接提供其FreeBSD,NetBSD的,或DragonFlyBSD。
socket.AF_QIPCRTR
高通IPC路由器协议的常数,用于与提供远程处理器的服务进行通信。
可用性:Linux> = 4.7。
函数
创建插座
以下函数均创建套接字对象。
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或CAN_ISOTP。
如果指定了fileno,则会从指定的文件描述符中自动检测family,type和proto的值。通过使用显式family,type或proto 参数调用该函数,可以否决自动检测。这只会影响Python表示的方式,例如,表示的socket.getpeername()是OS 的返回值,而不是实际的OS资源。不同于 socket.fromfd(),fileno将返回相同的套接字,而不是重复的套接字。这可能有助于使用来关闭分离的套接字 socket.close()。
新创建的套接字是不可继承的。
发起一个审计事件 socket.new带参数self,family,type,protocol。
在3.3版更改:添加了AF_CAN系列。添加了AF_RDS系列。
在 3.4 版更改: The CAN_BCM protocol was added.
在 3.4 版更改: The returned socket is now non-inheritable.
在 3.7 版更改: The CAN_ISOTP protocol was added.
在3.7版更改:当SOCK_NONBLOCK或将SOCK_CLOEXEC 位标志应用于类型时,它们将被清除,并且 socket.type不会反映出来。它们仍然传递给基础系统的socket()调用。因此::
袜子= socket.socket(
socket.AF_INET,socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
仍会在支持的操作系统上创建一个非阻塞套接字 SOCK_NONBLOCK,但sock.type将其设置为 socket.SOCK_STREAM。
socket.socketpair([ 家庭[,类型[,原型] ] ] )
使用给定的地址族,套接字类型和协议号构建一对连接的套接字对象。地址族,套接字类型和协议号与上述socket()功能相同。AF_UNIX 如果在平台上定义,则为默认系列。否则,默认值为AF_INET。
新创建的套接字是不可继承的。
在3.2版更改中:现在返回的套接字对象支持整个套接字API,而不是子集。
在 3.4 版更改: The returned sockets are now non-inheritable.
在 3.5 版更改: Windows support added.
socket.create_connection(address [,timeout [,source_address ] ] )
连接到侦听Internet 地址(2元组 )的TCP服务,并返回套接字对象。这是一个更高层次的功能比:如果主机是一个非数字的主机名,它会尽力解决两个和,然后尝试连接到所有可能的地址,直到有一个连接成功。这使得编写兼容IPv4和IPv6的客户端变得容易。(host, port)socket.connect()AF_INETAF_INET6
传递可选的timeout参数将在尝试连接之前在套接字实例上设置超时。如果没有超时供应,全局默认超时设置返回的 getdefaulttimeout()使用。
如果提供,则source_address必须为2元组,以便套接字在连接之前绑定为其源地址。如果主机或端口分别为''或0,则将使用操作系统默认行为。(host, port)
在 3.2 版更改: 添加了 source_address。
socket.create_server(address,*,family = AF_INET,backlog = None,复用端口= False,dualstack_ipv6 = False )
便捷函数,该函数创建绑定到地址(2元组 )的TCP套接字并返回套接字对象。(host, port)
家庭应该是AF_INET或AF_INET6。 backlog是传递给的队列大小socket.listen();当0 选择了默认合理的值。 redirect_port指示是否设置SO_REUSEPORT套接字选项。
如果dualstack_ipv6为true且平台支持它,则套接字将能够接受IPv4和IPv6连接,否则它将引发 ValueError。大多数POSIX平台和Windows应该支持此功能。启用此功能后,socket.getpeername()发生IPv4连接时返回的地址 将是表示为映射到IPv4的IPv6地址的IPv6地址。如果dualstack_ipv6为false,它将在默认启用该功能的平台(例如Linux)上显式禁用此功能。该参数可以与has_dualstack_ipv6()以下命令结合使用:
import socket
addr = ("", 8080) # all interfaces, port 8080
if socket.has_dualstack_ipv6():
s = socket.create_server(addr, family=socket.AF_INET6, dualstack_ipv6=True)
else:
s = socket.create_server(addr)
注解 在POSIX平台上,SO_REUSEADDR设置socket选项是为了立即重用以前的套接字,这些套接字绑定在同一地址上 并保持TIME_WAIT状态。
3.8 新版功能.
socket.has_dualstack_ipv6()
True如果平台支持创建可以处理IPv4和IPv6连接的TCP套接字,则返回。
3.8 新版功能.
socket.fromfd(fd,family,type,proto = 0 )
复制文件描述符fd(由文件对象的fileno()方法返回的整数 ),并根据结果构建套接字对象。地址族,套接字类型和协议号与上述socket()功能相同。文件描述符应引用一个套接字,但未选中---如果文件描述符无效,则对该对象的后续操作可能会失败。很少需要此函数,但是可以使用该函数在作为标准输入或输出(例如由Unix inet守护程序启动的服务器)传递给程序的套接字上获取或设置套接字选项。假定该套接字处于阻止模式。
新创建的套接字是不可继承的。
在 3.4 版更改: The returned socket is now non-inheritable.
socket.fromshare(数据)
根据从该socket.share() 方法获得的数据实例化套接字。假定该套接字处于阻止模式。
可用性: Windows。
3.3 新版功能.
socket.SocketType
这是一个表示套接字对象类型的Python类型对象。与相同type(socket(...))。
其他功能
该socket模块还提供各种与网络相关的服务:
socket.close(fd )
关闭套接字文件描述符。就像os.close(),但是用于套接字。在某些平台上(最引人注目的Windows)os.close() 不适用于套接字文件描述符。
3.7 新版功能.
socket.getaddrinfo(host,port,family = 0,type = 0,proto = 0,flags = 0 )
将主机 / 端口参数转换为5元组的序列,其中包含创建连接到该服务的套接字所需的所有必要参数。 host是域名,是IPv4 / v6地址或的字符串表示形式None。port是一个字符串服务名称,例如'http'数字端口号或None。通过传递host 和portNone的值,您可以传递给基础C API。NULL
该家族,类型和原参数可以以缩小返回的地址的列表中随意指定的。为这些参数中的每个参数传递零作为值将选择整个结果范围。该标志参数可以是一个或几个的AI_*常数,会影响结果的方式计算并返回。例如,AI_NUMERICHOST如果主机是域名,将禁用域名解析并引发错误。
该函数返回具有以下结构的5元组列表:
(family, type, proto, canonname, sockaddr)
在这些元组中,family,type,proto都是整数,并打算传递给socket()函数。 如果 属于flags参数,canonname将是代表主机规范名称的字符串;否则canonname 将为空。 sockaddr是一个描述套接字地址的元组,其格式取决于返回的族(表示为2个元组 ,表示为4个元组 ),并打算传递给该 方法。AI_CANONNAME(address, port)AF_INET(address, port, flow info, scope id)AF_INET6socket.connect()
发起一个审计事件 socket.getaddrinfo带参数host,port,family,type,protocol。
下面的示例为example.org端口80上的虚拟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 版更改: parameters can now be passed using keyword arguments.
在3.7版更改中:对于IPv6多播地址,表示地址的字符串将不包含%scope部分。
socket.getfqdn([name])
返回的一个完全合格的域名名称。如果name省略或为空,则将其解释为本地主机。要查找标准名称,请gethostbyaddr()检查由返回的主机名,然后是主机的别名(如果有)。选择包含句点的名字。如果没有完全限定的域名可用,则返回由gethostname()返回的主机名 。
socket.gethostbyname(主机名)
将主机名转换为IPv4地址格式。IPv4地址以字符串形式返回,例如 '100.50.200.5'。如果主机名本身是IPv4地址,则返回原样。请参阅gethostbyname_ex()以获得更完整的界面。gethostbyname()不支持IPv6名称解析, getaddrinfo()应将其用于IPv4 / v6双堆栈支持。
使用参数引发审核事件 。socket.gethostbynamehostname
socket.gethostbyname_ex(主机名)
将主机名转换为IPv4地址格式的扩展接口。返回一个三元组,其中主机名是响应给定ip_address的主要主机名,别名列表是同一地址的替代主机名的列表(可能为空),而ipaddrlist是同一主机上同一接口的IPv4地址的列表(通常但并非总是一个地址)。不支持IPv6名称解析,应将其用于IPv4 / v6双堆栈支持。(hostname, aliaslist, ipaddrlist)gethostbyname_ex()getaddrinfo()
使用参数引发审核事件 。socket.gethostbynamehostname
socket.gethostname()
返回一个字符串,其中包含Python解释器当前正在执行的机器的主机名。
引发不带参数的审核事件 socket.gethostname。
注意:gethostname()并非总是返回完全限定的域名;使用getfqdn()了点。
socket.gethostbyaddr(ip_address )
返回一个三元组,其中主机名是响应给定ip_address的主要主机名,别名列表是同一地址的备用主机名的列表(可能为空),而 ipaddrlist是同一接口上同一接口的IPv4 / v6地址的列表主机(最有可能只包含一个地址)。要查找完全合格的域名,请使用功能。同时支持IPv4和IPv6。(hostname, aliaslist, ipaddrlist)getfqdn()gethostbyaddr()
使用参数引发审核事件 。socket.gethostbyaddrip_address
socket.getnameinfo(sockaddr,标志)
将套接字地址sockaddr转换为2元组。根据标志的设置,结果可以在host中包含标准域名或数字地址表示形式。同样,端口可以包含字符串端口名称或数字端口号。(host, port)
对于IPv6地址,%scope如果sockaddr 包含有意义的scopeid,则将其附加到主机部分。通常,这种情况发生在多播地址上。
有关标志的更多信息,请查阅getnameinfo(3)。
使用参数引发审核事件 。socket.getnameinfosockaddr
socket.getprotobyname(协议名)
将Internet协议名称(例如'icmp')转换为适合作为(可选的)第三个参数传递给socket() 函数的常量。通常只有在“原始”模式(SOCK_RAW)中打开的套接字才需要使用此方法。对于正常的套接字模式,如果协议省略或为零,则会自动选择正确的协议。
socket.getservbyname(servicename [,protocolname ] )
将Internet服务名称和协议名称转换为该服务的端口号。可选协议名称(如果提供)应为'tcp'或 'udp',否则任何协议都将匹配。
发起一个审计事件 socket.getservbyname带有参数servicename,protocolname。
socket.getservbyport(port [,protocolname ] )
将Internet端口号和协议名称转换为该服务的服务名称。可选协议名称(如果提供)应为'tcp'或 'udp',否则任何协议都将匹配。
发起一个审计事件 socket.getservbyport带有参数port,protocolname。
socket.ntohl(x )
将32位正整数从网络转换为主机字节顺序。在主机字节顺序与网络字节顺序相同的计算机上,这是一个空操作;否则,它将执行4字节交换操作。
socket.ntohs(x )
将16位正整数从网络转换为主机字节顺序。在主机字节顺序与网络字节顺序相同的计算机上,这是一个空操作;否则,它将执行2字节交换操作。
3.7版后已可移除:如果x不适合16位无符号整数,但适合正C int,则将其静默截断为16位无符号整数。不推荐使用此静音截断功能,它将在将来的Python版本中引发异常。
socket.htonl(x )
将32位正整数从主机转换为网络字节顺序。在主机字节顺序与网络字节顺序相同的计算机上,这是一个空操作;否则,它将执行4字节交换操作。
socket.htons(x )
将主机的16位正整数转换为网络字节顺序。在主机字节顺序与网络字节顺序相同的计算机上,这是一个空操作;否则,它将执行2字节交换操作。
3.7版后已可移除:如果x不适合16位无符号整数,但适合正C int,则将其静默截断为16位无符号整数。不推荐使用此静音截断功能,它将在将来的Python版本中引发异常。
socket.inet_aton(ip_string )
将IPv4地址从点分四进制字符串格式(例如'123.45.67.89')转换为32位压缩二进制格式,作为字节对象,长度为四个字符。与使用标准C库并需要type对象的程序进行对话时,此功能非常有用,该对象是此函数返回的32位压缩二进制文件的C类型。struct in_addr
inet_aton()还接受少于三个点的字符串;有关详细信息,请参见Unix手册页inet(3)。
如果传递给此功能的IPv4地址字符串无效, OSError则会引发。请注意,确切有效的内容取决于的基础C实现inet_aton()。
inet_aton()不支持IPv6,而inet_pton()应改为用于IPv4 / v6双堆栈支持。
socket.inet_ntoa(packed_ip )
将32位压缩的IPv4地址(类似字节的对象,长度为4个字节)转换为其标准的点分四进制字符串表示形式(例如'123.45.67.89')。与使用标准C库并需要type对象的程序进行对话时,此功能很有用。该对象是此函数作为参数的32位打包二进制数据的C类型。struct in_addr
如果传递给此函数的字节序列的长度不完全是4个字节,OSError将被引发。inet_ntoa()不支持IPv6,而inet_ntop()应改为用于IPv4 / v6双堆栈支持。
在 3.5 版更改: 现在支持可写的 字节类对象。
socket.inet_pton(address_family,ip_string )
将IP地址从其特定于家庭的字符串格式转换为压缩的二进制格式。inet_pton()当库或网络协议调用类型(类似于 )或的对象时,此功能很有用。struct in_addrinet_aton()struct in6_addr
为支持的值address_family当前AF_INET和 AF_INET6。如果IP地址字符串ip_string无效, OSError则会引发。请注意,确切有效的内容取决于address_family的值和的基础实现 inet_pton()。
可用性:Unix(可能不是所有平台),Windows。
在 3.4 版更改: Windows support added
socket.inet_ntop(address_family,packed_ip )
将压缩的IP地址(字节大小的类似字节的对象)转换为其标准的,特定于家庭的字符串表示形式(例如'7.10.0.5'或'5aef:2b::8')。 inet_ntop()当库或网络协议返回类型(类似于)或 的对象时,此功能很有用。struct in_addrinet_ntoa()struct in6_addr
为支持的值address_family当前AF_INET和 AF_INET6。如果字节对象packed_ip对于指定的地址系列而言不是正确的长度,ValueError则会引发。 OSError因调用导致错误而引发inet_ntop()。
可用性:Unix(可能不是所有平台),Windows。
在 3.4 版更改: Windows support added
在 3.5 版更改: 现在支持可写的 字节类对象。
socket.CMSG_LEN(长度)
返回带有给定长度的关联数据的辅助数据项的总长度(不带尾部填充)。此值通常可用作recvmsg()接收单个辅助数据项的缓冲区大小,但是RFC 3542要求使用可移植的应用程序CMSG_SPACE(),因此包括填充空间,即使该项将是缓冲区中的最后一项也是如此。OverflowError如果 length超出值的允许范围,则引发。
可用性:大多数Unix平台,可能还有其他平台。
3.3 新版功能.
socket.CMSG_SPACE(长度)
返回用于recvmsg()接收带有给定长度的关联数据的辅助数据项 以及任何尾随填充所需的缓冲区大小。接收多个项目所需的缓冲区空间是CMSG_SPACE() 其关联数据长度的值之和。OverflowError如果length超出值的允许范围,则引发 。
请注意,某些系统可能不提供此功能就支持辅助数据。还要注意,使用此功能的结果来设置缓冲区大小可能不会精确地限制可以接收的辅助数据量,因为其他数据可能会适合填充区域。
可用性:大多数Unix平台,可能还有其他平台。
3.3 新版功能.
socket.getdefaulttimeout()
返回新套接字对象的默认超时(以秒为单位)(浮动)。值None表示新的套接字对象没有超时。首次导入套接字模块时,默认值为None。
socket.setdefaulttimeout(超时)
为新的套接字对象设置默认超时(以秒为单位)(浮动)。首次导入套接字模块时,默认值为None。请参阅 settimeout()以获取可能的值及其各自的含义。
socket.sethostname(name)
将机器的主机名设置为name。OSError如果您没有足够的权限,则会引发 。
使用参数引发审核事件 。socket.sethostnamename
可用性:Unix。
3.3 新版功能.
socket.if_nameindex()
返回网络接口信息(索引int,名称字符串)元组的列表。 OSError如果系统调用失败。
可用性: Unix, Windows。
3.3 新版功能.
在 3.8 版更改: Windows support was added.
socket.if_nametoindex(if_name )
返回与接口名称相对应的网络接口索引号。 OSError如果不存在具有给定名称的接口。
可用性: Unix, Windows。
3.3 新版功能.
在 3.8 版更改: Windows support was added.
socket.if_indextoname(if_index )
返回与接口索引号相对应的网络接口名称。 OSError如果不存在具有给定索引的接口。
可用性: Unix, Windows。
3.3 新版功能.
在 3.8 版更改: Windows support was added.
socket对象
套接字对象具有以下方法。除之外 makefile(),它们对应于适用于套接字的Unix系统调用。
在3.2版更改中:添加了对上下文管理器协议的支持。退出上下文管理器等同于调用close()。
socket.accept()
接受连接。套接字必须绑定到一个地址并监听连接。返回值是一对,其中conn是可用于在连接上发送和接收数据的 新套接字对象,而 address是绑定到连接另一端上的套接字的地址。(conn, address)
新创建的套接字是不可继承的。
在 3.4 版更改: The socket is now non-inheritable.
在3.5版更改:如果系统调用被中断并且信号处理程序没有引发异常,则该方法现在重试系统调用而不是引发InterruptedError异常(请参见PEP 475)。
socket.bind(地址)
将套接字绑定到address。套接字必须尚未绑定。(地址的格式取决于地址系列---见上文。)
发起一个审计事件 socket.bind带有参数self,address。
socket.close()
将插座标记为关闭。当来自makefile() 中的所有文件对象都关闭时,基础系统资源(例如文件描述符)也将关闭。一旦发生这种情况,套接字对象上的所有将来操作都会失败。远端将不再接收任何数据(在清除排队的数据之后)。
套接字在被垃圾回收时会自动关闭,但建议close()显式建议使用套接字,或在其with周围使用 语句。
在3.6版更改:OSError现在在进行基础close()调用时发生错误时引发 。
注解 close()释放与连接关联的资源,但不一定立即关闭连接。如果你想关闭及时连接,调用shutdown() 之前close()。
socket.connect(地址)
连接到地址为的远程套接字。(地址的格式取决于地址系列---见上文。)
如果连接被信号中断,则该方法将等待直到连接完成,或者socket.timeout如果信号处理程序未引发异常并且套接字正在阻塞或发生超时,则引发on超时。对于非阻塞套接字,InterruptedError如果连接被信号中断(或者信号处理程序引发的异常),则该方法引发 异常。
发起一个审计事件 socket.connect带有参数self,address。
在3.5版更改:该方法现在等待直到连接完成,而不是 InterruptedError如果连接被信号中断,信号处理程序没有引发异常并且套接字正在阻塞或具有超时,则引发异常(请参见PEP 475)。
socket.connect_ex(地址)
与相似connect(address),但是返回错误指示符而不是针对C级connect()调用返回的错误引发异常(其他问题,例如“找不到主机”仍然可以引发异常)。错误指示符是0操作是否成功,否则为errno变量的值 。这对于支持例如异步连接很有用。
发起一个审计事件 socket.connect带有参数self,address。
socket.detach()
将套接字对象置于关闭状态,而无需实际关闭基础文件描述符。返回文件描述符,并且可以将其重新用于其他目的。
3.2 新版功能.
socket.dup()
复制套接字。
新创建的套接字是不可继承的。
在 3.4 版更改: The socket is now non-inheritable.
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,则它指定用于接收选项的缓冲区的最大长度,并且此缓冲区作为字节对象返回。由调用者决定是否对缓冲区的内容进行解码(有关struct解码编码为字节字符串的C结构的方法,请参见可选的内置模块)。
socket.getblocking()
True如果套接字处于阻塞模式,False则返回;如果处于非阻塞状态,则返回。
这相当于检查。socket.gettimeout() == 0
3.7 新版功能.
socket.gettimeout()
返回与套接字操作相关的超时(以秒为单位)(浮动),或者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 was added.
socket.listen([ 积压] )
启用服务器以接受连接。如果指定了积压,则必须至少为0(如果较低,则将其设置为0);否则,必须为0。它指定系统在拒绝新连接之前允许的不可接受的连接数。如果未指定,则选择默认的合理值。
在 3.5 版更改: The backlog parameter is now optional.
socket.makefile(mode ='r',buffering = None,*,encoding = None,errors = None,newline = None )
返回与套接字关联的文件对象。确切的返回类型取决于赋予的参数makefile()。这些参数的解释方式与内置open()函数相同,只是唯一支持的模式值是'r'(默认)'w'和'b'。
套接字必须处于阻止模式;它可能会超时,但是如果发生超时,文件对象的内部缓冲区可能会以不一致的状态结束。
makefile()除非所有其他文件对象都已关闭并且socket.close()已在套接字对象上调用,否则关闭由返回的文件对象不会关闭原始套接字 。
注解 在Windows上,makefile()无法在需要带有文件描述符的文件对象(例如的流参数)使用创建的类似文件的对象subprocess.Popen()。
socket.recv(bufsize [,flags ] )
从套接字接收数据。返回值是一个字节对象,代表接收到的数据。一次要接收的最大数据量由bufsize指定。有关可选参数标志的含义,请参见Unix手册页recv(2);它默认为零。
注解 为了与硬件和网络实际情况进行最佳匹配,bufsize的值 应为2的相对较小的幂,例如4096。
在3.5版更改:如果系统调用被中断并且信号处理程序没有引发异常,则该方法现在重试系统调用而不是引发InterruptedError异常(请参见PEP 475)。
socket.recvfrom(bufsize [,flags ] )
从套接字接收数据。返回值是一对 ,其中bytes是表示接收到的数据的字节对象,而address是发送数据的套接字的地址。有关可选参数标志的含义,请参见Unix手册页 recv(2);它默认为零。(地址的格式取决于地址系列---见上文。)(bytes, address)
在3.5版更改:如果系统调用被中断并且信号处理程序没有引发异常,则该方法现在重试系统调用而不是引发InterruptedError异常(请参见PEP 475)。
在3.7版更改:对于IPv6组播地址的第一个项目地址不包含 %scope一部分了。为了获得完整的IPv6地址,请使用 getnameinfo()。
socket.recvmsg(bufsize [,ancbufsize [,flags ] ] )
从套接字接收普通数据(最多bufsize字节)和辅助数据。所述ancbufsize参数设置在用于接收的辅助数据的内部缓冲区的字节大小; 它默认为0,表示将不会接收任何辅助数据。可以使用CMSG_SPACE()或来计算辅助数据的适当缓冲区大小, CMSG_LEN()不适合缓冲区的项目可能会被截断或丢弃。该标志 参数默认为0,有用法相同 recv()。
返回值为4元组:。该数据项是一个保持接收到的非辅助性的数据对象。该ancdata项是零个或多个元组的列表表示接收的辅助数据(控制消息):cmsg_level和 cmsg_type分别指定协议级和协议特定的类型整数,且cmsg_data是 保持相关联的数据对象。该msg_flags 项是按位或的各种标志指示在接收到的消息的条件; 有关详细信息,请参见系统文档。如果接收插座未连接,则地址(data, ancdata, msg_flags, address)bytes(cmsg_level, cmsg_type, cmsg_data)bytes是发送套接字的地址(如果有);否则,其值未指定。
在某些系统,sendmsg()并且recvmsg()可以被用于在一个进程之间传递文件描述符AF_UNIX 插座。使用此功能时(通常仅限于 SOCK_STREAM套接字),recvmsg()它将在其辅助数据中返回形式为的项,其中fds是一个对象,该对象将新文件描述符表示为本机C 类型的二进制数组。如果在系统调用返回后引发异常,它将首先尝试关闭通过此机制接收到的所有文件描述符。(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds)bytesintrecvmsg()
一些系统没有指示仅部分接收到的辅助数据项的截短长度。如果某项似乎超出了缓冲区的末尾,recvmsg()则将发出一个RuntimeWarning,并返回其在缓冲区内的部分,前提是该对象在关联数据开始之前没有被截断。
在支持该SCM_RIGHTS机制的系统上,以下函数将最多接收maxfds文件描述符,返回消息数据和包含描述符的列表(同时忽略意外条件,例如接收到无关的控制消息)。另请参阅sendmsg()。
import socket, array
def recv_fds(sock, msglen, maxfds):
fds = array.array("i") # Array of ints
msg, ancdata, flags, addr = sock.recvmsg(msglen, socket.CMSG_LEN(maxfds * fds.itemsize))
for cmsg_level, cmsg_type, cmsg_data in ancdata:
if cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS:
# Append data, ignoring any truncated integers at the end.
fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
return msg, list(fds)
可用性:大多数Unix平台,可能还有其他平台。
3.3 新版功能.
在3.5版更改:如果系统调用被中断并且信号处理程序没有引发异常,则该方法现在重试系统调用而不是引发InterruptedError异常(请参见PEP 475)。
socket.recvmsg_into(缓冲区[,ancbufsize [,标志] ] )
以正常方式从套接字接收普通数据和辅助数据 recvmsg(),但将非辅助数据分散到一系列缓冲区中,而不是返回新的字节对象。所述 缓冲器参数必须是可迭代的对象,出口可写缓冲液(例如bytearray对象); 它们将被连续的非辅助数据块填充,直到全部被写入或不再有缓冲区为止。操作系统可以设置可以使用的缓冲区数的限制(sysconf()值SC_IOV_MAX)。该ancbufsize和 标志参数的含义为相同recvmsg()。
返回值是一个4元组:,其中nbytes是写入缓冲区的非辅助数据的字节总数,并且ancdata, msg_flags和address与for相同。(nbytes, ancdata, msg_flags, address)recvmsg()
示例:
import socket
s1, s2 = socket.socketpair()
b1 = bytearray(b'----')
b2 = bytearray(b'0123456789')
b3 = bytearray(b'--------------')
s1.send(b'Mary had a little lamb')
22
s2.recvmsg_into([b1, memoryview(b2)[2:9], b3])
(22, [], 0, None)
[b1, b2, b3]
[bytearray(b'Mary'), bytearray(b'01 had a 9'), bytearray(b'little lamb---')]
可用性:大多数Unix平台,可能还有其他平台。
3.3 新版功能.
socket.recvfrom_into(buffer [,nbytes [,flags ] ] )
从套接字接收数据,将其写入缓冲区,而不是创建新的字节串。返回值是一对,其中nbytes是接收的字节数,address是发送数据的套接字的地址。有关可选参数标志的含义,请参见Unix手册页recv(2);它默认为零。(地址的格式 取决于地址系列---见上文。)(nbytes, address)
socket.recv_into(buffer [,nbytes [,flags ] ] )
从套接字接收最多nbytes个字节,将数据存储到缓冲区中,而不是创建一个新的字节串。如果未指定nbytes(或0),则接收给定缓冲区中的可用大小。返回接收到的字节数。有关可选参数标志的含义,请参见Unix手册页recv(2);它默认为零。
socket.send(字节[,标志] )
将数据发送到套接字。该套接字必须连接到远程套接字。可选标志参数的含义与recv()上述含义相同。返回发送的字节数。应用程序负责检查所有数据是否已发送;如果仅传输了一些数据,则应用程序需要尝试传送其余数据。有关此主题的更多信息,请查阅《通用编程指南》。
在3.5版更改:如果系统调用被中断并且信号处理程序没有引发异常,则该方法现在重试系统调用而不是引发InterruptedError异常(请参见PEP 475)。
socket.sendall(字节[,标志] )
将数据发送到套接字。该套接字必须连接到远程套接字。可选标志参数的含义与recv()上述含义相同。与send()方法不同,此方法继续从字节发送数据,直到发送完所有数据或发生错误为止。 None成功返回。如果出错,则会引发异常,并且无法确定成功发送了多少数据(如果有)。
在3.5版更改:每次成功发送数据后,套接字超时不再重置。现在,套接字超时是发送所有数据的最大总持续时间。
在3.5版更改:如果系统调用被中断并且信号处理程序没有引发异常,则该方法现在重试系统调用而不是引发InterruptedError异常(请参见PEP 475)。
socket.sendto(字节,地址)
socket.sendto(字节,标志,地址)
将数据发送到套接字。该套接字不应连接到远程套接字,因为目标套接字是由address指定的。可选标志 参数的含义与recv()上述含义相同。返回发送的字节数。(地址的格式取决于地址系列---见上文。)
发起一个审计事件 socket.sendto带有参数self,address。
在3.5版更改:如果系统调用被中断并且信号处理程序没有引发异常,则该方法现在重试系统调用而不是引发InterruptedError异常(请参见PEP 475)。
socket.sendmsg(缓冲区[,ancdata [,标志[,地址] ] ] )
将普通数据和辅助数据发送到套接字,从一系列缓冲区中收集非辅助数据,并将其串联为一条消息。所述缓冲器参数指定为可迭代的非辅助数据 字节状物体 (例如bytes对象); 操作系统可能会设置可使用的缓冲区数的限制(sysconf()值SC_IOV_MAX)。所述ancdata参数指定所述辅助数据(控制消息),为迭代的零个或多个元组 ,其中cmsg_level和 cmsg_type分别指定协议级和协议特定的类型整数,且cmsg_data(cmsg_level, cmsg_type, cmsg_data)是保存相关数据的类似字节的对象。请注意,某些系统(特别是没有的系统CMSG_SPACE())可能支持每个呼叫仅发送一条控制消息。该 标志参数默认为0,有用法相同 send()。如果提供了address而不提供了None,它将设置消息的目标地址。返回值是发送的非辅助数据的字节数。
以下函数在支持该机制的系统上, 通过套接字 发送文件描述符fds的列表。另请参阅。AF_UNIXSCM_RIGHTSrecvmsg()
import socket, array
def send_fds(sock, msg, fds):
return sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, array.array("i", fds))])
可用性:大多数Unix平台,可能还有其他平台。
发起一个审计事件 socket.sendmsg带有参数self,address。
3.3 新版功能.
在3.5版更改:如果系统调用被中断并且信号处理程序没有引发异常,则该方法现在重试系统调用而不是引发InterruptedError异常(请参见PEP 475)。
socket.sendmsg_afalg([ 消息,] *,对[,四[,assoclen [,标志] ] ] )
专业版sendmsg()的AF_ALG插座。设置模式,IV,AEAD关联的数据长度和AF_ALG套接字标志。
可用性:Linux> = 2.6.38。
3.6 新版功能.
socket.sendfile(file,offset = 0,count = None )[源代码)
使用高性能发送文件,直到达到EOF为止, os.sendfile并返回已发送的字节总数。 文件必须是以二进制模式打开的常规文件对象。如果 os.sendfile不可用(例如Windows)或文件不是常规文件,send()则将使用该文件。offset告诉您从哪里开始读取文件。如果指定,count是要发送的字节总数,而不是发送文件直到达到EOF。返回时或发生错误时,文件位置将更新,在这种情况下, file.tell()可以使用该位置来计算已发送的字节数。插座必须是SOCK_STREAM类型。不支持非阻塞套接字。
3.5 新版功能.
socket.set_inheritable(可继承的)
设置套接字的文件描述符或套接字的句柄的可继承标志。
3.4 新版功能.
socket.setblocking(标志)
设置套接字的阻塞或非阻塞模式:如果标志为false,则将套接字设置为非阻塞,否则设置为阻塞模式。
此方法是某些settimeout()调用的简写:
sock.setblocking(True) 相当于 sock.settimeout(None)
sock.setblocking(False) 相当于 sock.settimeout(0.0)
在 3.7 版更改: The method no longer applies SOCK_NONBLOCK flag on socket.type.
socket.settimeout(值)
在阻止套接字操作上设置超时。所述值参数可以是表达秒的非负的浮点数,或None。如果给出一个非零值,则在该操作完成之前已超过timeout超时时间值,则随后的套接字操作将引发 异常。如果给定零,则将套接字置于非阻塞模式。如果None给出,则套接字处于阻塞模式。
有关更多信息,请查阅有关套接字超时的说明。
在 3.7 版更改: The method no longer toggles SOCK_NONBLOCK flag on socket.type.
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或一个对象类字节代表一个缓冲器。在后一种情况下,由调用方确保字节串包含正确的位(有关将structC结构编码为字节串的方法,请参阅可选的内置模块)。当值设置为None, optlen是必需的参数。等效于setsockopt()使用optval=NULL和调用C函数optlen=optlen。
在 3.5 版更改: 现在支持可写的 字节类对象。
在 3.6 版更改: setsockopt(level, optname, None, optlen: int) form added.
socket.shutdown(如何)
关闭连接的一半或一半。如果怎么是SHUT_RD,还接收被禁止。如果怎么是SHUT_WR,进一步将是不允许的。如果怎么是SHUT_RDWR,进一步的发送和接收被禁止。
socket.share(process_id )
复制套接字,并准备将其与目标进程共享。目标进程必须提供有process_id。然后,可以使用某种形式的进程间通信将结果字节对象传递给目标进程,并可以使用在那里重新创建套接字fromshare()。一旦调用此方法,就可以安全地关闭套接字,因为操作系统已经为目标进程复制了该套接字。
可用性: Windows。
3.3 新版功能.
注意没有方法read()或write(); 而是使用 recv()and send()without flags参数。
套接字对象还具有这些(只读)属性,这些属性与提供给socket构造函数的值相对应。
socket.family
套接字家族。
socket.type
套接字类型。
socket.proto
套接字协议。
套接字超时注意事项
套接字对象可以处于以下三种模式之一:阻止,非阻止或超时。默认情况下,套接字始终以阻止模式创建,但是可以通过调用来更改setdefaulttimeout()。
在阻止模式下,操作将阻止直到完成或系统返回错误(例如连接超时)。
在非阻塞模式下,如果操作无法立即完成,则操作将失败(不幸的是,错误取决于系统):来自的函数 select可用于了解套接字何时以及是否可用于读取或写入。
在超时模式下,如果无法在为套接字指定的超时内完成操作(它们会引发timeout异常)或系统返回错误,则操作将失败。
注解 在操作系统级别,超时模式下的套接字在内部设置为非阻塞模式。同样,阻塞和超时模式在引用相同网络端点的文件描述符和套接字对象之间共享。如果例如您决定使用fileno()套接字,则此实现细节可能会产生明显的后果。
超时和connect方法
该connect()操作还受超时设置的约束,通常建议在调用settimeout() 之前先调用connect()或将超时参数传递给 create_connection()。但是,无论任何Python套接字超时设置如何,系统网络堆栈也都可能返回其自身的连接超时错误。
超时和accept方法
如果getdefaulttimeout()不是None,则accept()方法返回的套接字将继承该超时。否则,其行为取决于侦听套接字的设置:
如果侦听套接字处于阻塞模式或超时模式,则返回的套接字accept()处于阻塞模式 ;
如果侦听套接字处于非阻塞模式,则由返回的套接字accept()处于阻塞还是非阻塞模式取决于操作系统。如果要确保跨平台行为,建议您手动覆盖此设置。
示例
以下是使用TCP / IP协议的四个最小示例程序:一台服务器,该服务器回显它收到的所有数据(仅服务于一个客户端),以及一个使用它的客户端。注意,服务器必须执行序列socket(), bind(),listen(),accept()(可能重复accept(),以服务一个以上的客户端),而一个客户端只需要在序列socket(),connect()。另请注意,服务器不在sendall()/ recv()正在监听的套接字上,而是/ 返回的新套接字上 accept()。
前两个示例仅支持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))
接下来的两个示例与以上两个示例相同,但同时支持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上使用原始套接字编写一个非常简单的网络嗅探器。该示例需要管理员特权才能修改接口:
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)
下一个示例说明如何使用套接字接口通过原始套接字协议与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语言编写)的介绍,请参见以下文章:
Stuart Sechrest撰写的4.3BSD进程间通信入门教程
Samuel J. Leffler等人撰写的高级4.3BSD进程间通信教程,
两者均在UNIX程序员手册,补充文档1(第PS1:7和PS1:8节)中进行。各种与套接字相关的系统调用的特定于平台的参考资料也是有关套接字语义详细信息的宝贵信息来源。对于Unix,请参考手册页。对于Windows,请参阅WinSock(或Winsock 2)规范。对于支持IPv6的API,读者可能需要参考RFC 3493,标题为IPv6的基本套接字接口扩展。