2019-11-28,socket --- 底層網(wǎng)絡(luò)接口

socket --- 底層網(wǎng)絡(luò)接口
源代碼: Lib/socket.py

這個(gè)模塊提供了訪問(wèn)BSD套接字的接口。在所有現(xiàn)代Unix系統(tǒng)、Windows、macOS和其他一些平臺(tái)上可用。

注解 一些行為可能因平臺(tái)不同而異,因?yàn)檎{(diào)用的是操作系統(tǒng)的套接字API。
這個(gè)Python接口是用Python的面向?qū)ο箫L(fēng)格對(duì)Unix系統(tǒng)調(diào)用和套接字庫(kù)接口的直譯:函數(shù) socket() 返回一個(gè) 套接字對(duì)象 ,其方法是對(duì)各種套接字系統(tǒng)調(diào)用的實(shí)現(xiàn)。形參類型一般與C接口相比更高級(jí):例如在Python文件 read() 和 write() 操作中,接收操作的緩沖區(qū)分配是自動(dòng)的,發(fā)送操作的緩沖區(qū)長(zhǎng)度是隱式的。

參見(jiàn)
模塊 socketserver
用于簡(jiǎn)化網(wǎng)絡(luò)服務(wù)端編寫(xiě)的類。

模塊 ssl
套接字對(duì)象的TLS/SSL封裝。

套接字協(xié)議族
根據(jù)系統(tǒng)以及構(gòu)建選項(xiàng),此模塊提供了各種套接字協(xié)議簇。

特定的套接字對(duì)象需要的地址格式將根據(jù)此套接字對(duì)象被創(chuàng)建時(shí)指定的地址族被自動(dòng)選擇。套接字地址表示如下:

一個(gè)綁定在文件系統(tǒng)節(jié)點(diǎn)上的 AF_UNIX 套接字的地址表示為一個(gè)字符串,使用文件系統(tǒng)字符編碼和 'surrogateescape' 錯(cuò)誤回調(diào)方法(see PEP 383)。一個(gè)地址在 Linux 的抽象命名空間被返回為帶有初始的 null 字節(jié)的 字節(jié)類對(duì)象 ;注意在這個(gè)命名空間種的套接字可能與普通文件系統(tǒng)套接字通信,所以打算運(yùn)行在 Linux 上的程序可能需要解決兩種地址類型。當(dāng)傳遞為參數(shù)時(shí),一個(gè)字符串或字節(jié)類對(duì)象可以用于任一類型的地址。

在 3.3 版更改: 之前,AF_UNIX 套接字路徑被假設(shè)使用 UTF-8 編碼。

在 3.5 版更改: 現(xiàn)在支持可寫(xiě)的 字節(jié)類對(duì)象。

一對(duì) (host, port) 被用于 AF_INET 地址族,host 是一個(gè)表示為互聯(lián)網(wǎng)域名表示法之內(nèi)的主機(jī)名或者一個(gè) IPv4 地址的字符串,例如 'daring.cwi.nl' 或 '100.50.200.5',port 是一個(gè)整數(shù)。

對(duì)于 IPv4 地址,有兩種可接受的特殊形式被用來(lái)代替一個(gè)主機(jī)地址: '' 代表 INADDR_ANY,用來(lái)綁定到所有接口;字符串 '<broadcast>' 代表 INADDR_BROADCAST。此行為不兼容 IPv6,因此,如果你的 Python 程序打算支持 IPv6,則可能需要避開(kāi)這些。

對(duì)于 AF_INET6 地址族,使用一個(gè)四元組 (host, port, flowinfo, scopeid), flowinfo 和 scopeid 代表了 C 庫(kù)里 struct sockaddr_in6 中的 sin6_flowinfo 和 sin6_scope_id 成員。 對(duì)于 socket 模塊中的方法, flowinfo 和 scopeid 可以被省略,只為了向后兼容。注意,scopeid 的省略可能會(huì)導(dǎo)致 problems in manipulating scoped IPv6 addresses。

在3.7版更改中:對(duì)于多播地址(有意義的作用域ID),地址可能不包含 %scope(或)部分。此信息是多余的,可以安全地省略(推薦)。zone id

AF_NETLINK套接字表示為對(duì)。(pid, groups)

使用AF_TIPC 地址族可以獲得對(duì)TIPC的僅Linux支持。TIPC是一種開(kāi)放的,非基于IP的網(wǎng)絡(luò)協(xié)議,旨在用于群集計(jì)算機(jī)環(huán)境中。地址由元組表示,并且字段取決于地址類型。元組的一般形式為 ,其中:(addr_type, v1, v2, v3 [, scope])

ADDR_TYPE是一個(gè)TIPC_ADDR_NAMESEQ,TIPC_ADDR_NAME或TIPC_ADDR_ID。

范圍是一個(gè)TIPC_ZONE_SCOPE,TIPC_CLUSTER_SCOPE和 TIPC_NODE_SCOPE。

如果addr_type為T(mén)IPC_ADDR_NAME,則v1為服務(wù)器類型,v2為端口標(biāo)識(shí)符,并且v3應(yīng)為0。

如果addr_type是TIPC_ADDR_NAMESEQ,則v1是服務(wù)器類型,v2 是下端口號(hào),v3是上端口號(hào)。

如果addr_type是TIPC_ADDR_ID,則v1是節(jié)點(diǎn),v2是引用,并且v3應(yīng)該設(shè)置為0。

元組用于地址族,其中interface是表示網(wǎng)絡(luò)接口名稱(如)的字符串 。網(wǎng)絡(luò)接口名稱可用于接收來(lái)自該系列所有網(wǎng)絡(luò)接口的數(shù)據(jù)包。(interface, )AF_CAN'can0'''

CAN_ISOTP協(xié)議需要一個(gè)元組 ,其中兩個(gè)附加參數(shù)均為表示CAN標(biāo)識(shí)符(標(biāo)準(zhǔn)或擴(kuò)展)的無(wú)符號(hào)長(zhǎng)整數(shù)。(interface, rx_addr, tx_addr)

字符串或元組用于 該家族的協(xié)議。該字符串是使用動(dòng)態(tài)分配的ID的內(nèi)核控件的名稱。如果知道內(nèi)核控件的ID和單元號(hào)或使用已注冊(cè)的ID,則可以使用元組。(id, unit)SYSPROTO_CONTROLPF_SYSTEM

3.3 新版功能.

AF_BLUETOOTH 支持以下協(xié)議和地址格式:

BTPROTO_L2CAP接受where 是藍(lán)牙地址作為字符串,并且是整數(shù)。(bdaddr, psm)bdaddrpsm

BTPROTO_RFCOMM接受where 是藍(lán)牙地址作為字符串,并且是整數(shù)。(bdaddr, channel)bdaddrchannel

BTPROTO_HCI接受(device_id,)其中device_id是整數(shù)或與接口的藍(lán)牙地址的字符串。(這取決于您的操作系統(tǒng); NetBSD和DragonFlyBSD需要一個(gè)藍(lán)牙地址,而其他所有都需要一個(gè)整數(shù)。)

在 3.2 版更改: NetBSD and DragonFlyBSD support added.

BTPROTO_SCO接受bdaddr其中bdaddr的 bytes對(duì)象包含字符串格式的藍(lán)牙地址。(例如。b'12:23:34:45:56:67')FreeBSD不支持該協(xié)議。

AF_ALG是內(nèi)核加密的基于Linux的僅基于套接字的接口。算法套接字配置有兩個(gè)到四個(gè)元素的元組,其中:(type, name [, feat [, mask]])

類型是算法類型為字符串,例如aead,hash, skcipher或rng。

名稱是該算法的名稱和操作模式為字符串,例如 sha256,hmac(sha256),cbc(aes)或drbg_nopr_ctr_aes256。

feat和mask是無(wú)符號(hào)的32位整數(shù)。

可用性:Linux 2.6.38,某些算法類型需要更新的內(nèi)核。

3.6 新版功能.

AF_VSOCK允許虛擬機(jī)與其主機(jī)之間進(jìn)行通信。套接字表示為元組,其中上下文ID或CID和端口是整數(shù)。(CID, port)

可用性:Linux> = 4.8 QEMU> = 2.8 ESX> = 4.0 ESX工作站> = 6.5。

3.7 新版功能.

AF_PACKET是直接連接到網(wǎng)絡(luò)設(shè)備的低級(jí)接口。數(shù)據(jù)包由元組表示, 其中:(ifname, proto[, pkttype[, hatype[, addr]]])

ifname-指定設(shè)備名稱的字符串。

proto-網(wǎng)絡(luò)字節(jié)序整數(shù),指定以太網(wǎng)協(xié)議號(hào)。

pkttype-可選整數(shù),指定數(shù)據(jù)包類型:

PACKET_HOST (默認(rèn))-尋址到本地主機(jī)的數(shù)據(jù)包。

PACKET_BROADCAST -物理層廣播數(shù)據(jù)包。

PACKET_MULTIHOST -數(shù)據(jù)包發(fā)送到物理層多播地址。

PACKET_OTHERHOST -混雜到設(shè)備驅(qū)動(dòng)程序捕獲到的其他主機(jī)的數(shù)據(jù)包。

PACKET_OUTGOING -來(lái)自本地主機(jī)的數(shù)據(jù)包,該本地主機(jī)環(huán)回到數(shù)據(jù)包套接字。

hatype-可選整數(shù),指定ARP硬件地址類型。

addr-可選的類似字節(jié)的對(duì)象,指定硬件物理地址,其解釋取決于設(shè)備。

AF_QIPCRTR是基于Linux的僅基于套接字的接口,用于與在Qualcomm平臺(tái)上的協(xié)處理器上運(yùn)行的服務(wù)進(jìn)行通信。地址族表示為元組,其中節(jié)點(diǎn)和端口 為非負(fù)整數(shù)。(node, port)

3.8 新版功能.

如果你在 IPv4/v6 套接字地址的 host 部分中使用了一個(gè)主機(jī)名,此程序可能會(huì)表現(xiàn)不確定行為,因?yàn)?Python 使用 DNS 解析返回的第一個(gè)地址。套接字地址在實(shí)際的 IPv4/v6 中以不同方式解析,根據(jù) DNS 解析和/或 host 配置。為了確定行為,在 host 部分中使用數(shù)字的地址。

所有的錯(cuò)誤都拋出異常。對(duì)于無(wú)效的參數(shù)類型和內(nèi)存溢出異常情況可能拋出普通異常;從 Python 3.3 開(kāi)始,與套接字或地址語(yǔ)義有關(guān)的錯(cuò)誤拋出 OSError 或它的子類之一(常用 socket.error)。

可以用 setblocking() 設(shè)置非阻塞模式。一個(gè)基于超時(shí)的 generalization 通過(guò) settimeout() 支持。

模塊內(nèi)容
socket 模塊導(dǎo)出以下元素。

異常
異常socket.error
一個(gè)被棄用的 OSError 的別名。

在 3.3 版更改: 根據(jù) PEP 3151,這個(gè)類是 OSError 的別名。

異常socket.herror
OSError針對(duì)地址相關(guān)的錯(cuò)誤(即,對(duì)于在POSIX C API 中使用h_errno的函數(shù),包括gethostbyname_ex()和)引發(fā)的子類,此異常gethostbyaddr()。附帶的值是一對(duì),代表由庫(kù)調(diào)用返回的錯(cuò)誤。 h_errno是一個(gè)數(shù)值,而 string表示由C函數(shù)返回 的h_errno的描述。(h_errno, string)hstrerror()

在 3.3 版更改: This class was made a subclass of OSError.

異常socket.gaierror
對(duì)于的子類OSError,此異常由getaddrinfo()和引發(fā),用于地址相關(guān)的錯(cuò)誤getnameinfo()。附帶的值是一對(duì),代表由庫(kù)調(diào)用返回的錯(cuò)誤。 字符串表示對(duì)錯(cuò)誤的描述, 由C函數(shù)返回。數(shù)字錯(cuò)誤值將與該模塊中定義的常數(shù)之一匹配。(error, string)gai_strerror()EAI_*

在 3.3 版更改: This class was made a subclass of OSError.

異常socket.timeout
的子類OSError,當(dāng)套接字上發(fā)生超時(shí)時(shí)引發(fā)了此異常,該套接字通過(guò)先前的調(diào)用settimeout()(或通過(guò)隱式 setdefaulttimeout())啟用了超時(shí) 。附帶的值是一個(gè)字符串,其值當(dāng)前始終處于“超時(shí)”狀態(tài)。

在 3.3 版更改: This class was made a subclass of OSError.

常數(shù)
AF_ *和SOCK_ *常量現(xiàn)在是AddressFamily和 SocketKind IntEnum集合。

3.4 新版功能.

socket.AF_UNIX
socket.AF_INET
socket.AF_INET6
這些常量表示地址(和協(xié)議)系列,用于的第一個(gè)參數(shù)socket()。如果AF_UNIX未定義常量,則不支持該協(xié)議。根據(jù)系統(tǒng),可能會(huì)有更多的常量可用。

socket.SOCK_STREAM
socket.SOCK_DGRAM
socket.SOCK_RAW
socket.SOCK_RDM
socket.SOCK_SEQPACKET
這些常量表示套接字類型,用于的第二個(gè)參數(shù) socket()。根據(jù)系統(tǒng),可能會(huì)有更多的常量可用。(僅SOCK_STREAM并且SOCK_DGRAM似乎通常有用。)

socket.SOCK_CLOEXEC
socket.SOCK_NONBLOCK
這兩個(gè)常量(如果已定義)可以與套接字類型結(jié)合使用,并允許您自動(dòng)設(shè)置一些標(biāo)志(從而避免可能的爭(zhēng)用條件和單獨(dú)調(diào)用的需要)。

參見(jiàn) 安全文件描述符處理 提供了更詳盡的解釋。
可用性:Linux> = 2.6.27。

3.2 新版功能.

SO_*
socket.SOMAXCONN
MSG_*
SOL_*
SCM_*
IPPROTO_*
IPPORT_*
INADDR_*
IP_*
IPV6_*
EAI_*
AI_*
NI_*
TCP_*
在套接字模塊和/或IP協(xié)議的Unix文檔中記錄的這些形式的許多常量也在套接字模塊中定義。它們通常用于 套接字對(duì)象setsockopt()和getsockopt()方法的參數(shù)中。在大多數(shù)情況下,僅定義那些在Unix頭文件中定義的符號(hào);對(duì)于一些符號(hào),提供了默認(rèn)值。

在 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上,如果運(yùn)行時(shí)Windows支持TCP_KEEPIDLE,則TCP_KEEPINTVL出現(xiàn)。

socket.AF_CAN
socket.PF_CAN
SOL_CAN_*
CAN_*
套接字模塊中還定義了Linux文檔中記錄的這些形式的許多常量。

可用性:Linux> = 2.6.25。

3.3 新版功能.

socket.CAN_BCM
CAN_BCM_*
CAN協(xié)議家族中的CAN_BCM是廣播管理器(BCM)協(xié)議。套接字模塊中還定義了Linux文檔中記錄的廣播管理器常量。

可用性:Linux> = 2.6.25。

注解 該CAN_BCM_CAN_FD_FRAME標(biāo)志僅在>> 4.8的Linux上可用。
3.4 新版功能.

socket.CAN_RAW_FD_FRAMES
在CAN_RAW套接字中啟用CAN FD支持。默認(rèn)情況下禁用此功能。這使您的應(yīng)用程序可以發(fā)送CAN和CAN FD幀。但是,從套接字讀取時(shí),您必須同時(shí)接受CAN和CAN FD幀。

該常量在Linux文檔中有所記錄。

可用性:Linux> = 3.6。

3.5 新版功能.

socket.CAN_ISOTP
CAN協(xié)議家族中的CAN_ISOTP是ISO-TP(ISO 15765-2)協(xié)議。ISO-TP常數(shù),在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()套接字對(duì)象方法的參數(shù) 。

在 3.6 版更改: SIO_LOOPBACK_FAST_PATH was added.

TIPC_*
TIPC相關(guān)的常量,與C套接字API導(dǎo)出的常量匹配。有關(guān)更多信息,請(qǐng)參見(jiàn)TIPC文檔。

socket.AF_ALG
socket.SOL_ALG
ALG_*
Linux內(nèi)核加密的常量。

可用性:Linux> = 2.6.38。

3.6 新版功能.

socket.AF_VSOCK
socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
VMADDR*
SO_VM*
Linux主機(jī)/來(lái)賓通信的常量。

可用性:Linux> = 4.8。

3.7 新版功能.

socket.AF_LINK
可用性:BSD,OSX。

3.4 新版功能.

socket.has_ipv6
該常量包含一個(gè)布爾值,該值指示此平臺(tái)上是否支持IPv6。

socket.BDADDR_ANY
socket.BDADDR_LOCAL
這些是包含具有特殊含義的藍(lán)牙地址的字符串常量。例如,BDADDR_ANY當(dāng)用指定綁定套接字時(shí),可用于指示任何地址 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沒(méi)有直接提供其FreeBSD,NetBSD的,或DragonFlyBSD。

socket.AF_QIPCRTR
高通IPC路由器協(xié)議的常數(shù),用于與提供遠(yuǎn)程處理器的服務(wù)進(jìn)行通信。

可用性:Linux> = 4.7。

函數(shù)
創(chuàng)建插座
以下函數(shù)均創(chuàng)建套接字對(duì)象。

socket.socket(family = AF_INET,type = SOCK_STREAM,proto = 0,fileno = None )
使用給定的地址族,套接字類型和協(xié)議號(hào)創(chuàng)建一個(gè)新的套接字。地址家庭應(yīng)該是AF_INET(默認(rèn)), , AF_INET6,AF_UNIX,AF_CAN,AF_PACKET或AF_RDS。套接字類型應(yīng)為SOCK_STREAM(默認(rèn)值)SOCK_DGRAM,SOCK_RAW或其他 SOCK_常量之一。該協(xié)議數(shù)通常是零,并且可以省略或在其中的地址是家庭的情況下AF_CAN的協(xié)議應(yīng)該是一種CAN_RAW,CAN_BCM或CAN_ISOTP。

如果指定了fileno,則會(huì)從指定的文件描述符中自動(dòng)檢測(cè)family,type和proto的值。通過(guò)使用顯式family,type或proto 參數(shù)調(diào)用該函數(shù),可以否決自動(dòng)檢測(cè)。這只會(huì)影響Python表示的方式,例如,表示的socket.getpeername()是OS 的返回值,而不是實(shí)際的OS資源。不同于 socket.fromfd(),fileno將返回相同的套接字,而不是重復(fù)的套接字。這可能有助于使用來(lái)關(guān)閉分離的套接字 socket.close()。

新創(chuàng)建的套接字是不可繼承的。

發(fā)起一個(gè)審計(jì)事件 socket.new帶參數(shù)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版更改:當(dāng)SOCK_NONBLOCK或?qū)OCK_CLOEXEC 位標(biāo)志應(yīng)用于類型時(shí),它們將被清除,并且 socket.type不會(huì)反映出來(lái)。它們?nèi)匀粋鬟f給基礎(chǔ)系統(tǒng)的socket()調(diào)用。因此::

襪子= socket.socket(
socket.AF_INET,socket.SOCK_STREAM | socket.SOCK_NONBLOCK)

仍會(huì)在支持的操作系統(tǒng)上創(chuàng)建一個(gè)非阻塞套接字 SOCK_NONBLOCK,但sock.type將其設(shè)置為 socket.SOCK_STREAM。

socket.socketpair([ 家庭[,類型[,原型] ] ] )
使用給定的地址族,套接字類型和協(xié)議號(hào)構(gòu)建一對(duì)連接的套接字對(duì)象。地址族,套接字類型和協(xié)議號(hào)與上述socket()功能相同。AF_UNIX 如果在平臺(tái)上定義,則為默認(rèn)系列。否則,默認(rèn)值為AF_INET。

新創(chuàng)建的套接字是不可繼承的。

在3.2版更改中:現(xiàn)在返回的套接字對(duì)象支持整個(gè)套接字API,而不是子集。

在 3.4 版更改: The returned sockets are now non-inheritable.

在 3.5 版更改: Windows support added.

socket.create_connection(address [,timeout [,source_address ] ] )
連接到偵聽(tīng)I(yíng)nternet 地址(2元組 )的TCP服務(wù),并返回套接字對(duì)象。這是一個(gè)更高層次的功能比:如果主機(jī)是一個(gè)非數(shù)字的主機(jī)名,它會(huì)盡力解決兩個(gè)和,然后嘗試連接到所有可能的地址,直到有一個(gè)連接成功。這使得編寫(xiě)兼容IPv4和IPv6的客戶端變得容易。(host, port)socket.connect()AF_INETAF_INET6

傳遞可選的timeout參數(shù)將在嘗試連接之前在套接字實(shí)例上設(shè)置超時(shí)。如果沒(méi)有超時(shí)供應(yīng),全局默認(rèn)超時(shí)設(shè)置返回的 getdefaulttimeout()使用。

如果提供,則source_address必須為2元組,以便套接字在連接之前綁定為其源地址。如果主機(jī)或端口分別為''或0,則將使用操作系統(tǒng)默認(rèn)行為。(host, port)

在 3.2 版更改: 添加了 source_address。

socket.create_server(address,*,family = AF_INET,backlog = None,復(fù)用端口= False,dualstack_ipv6 = False )
便捷函數(shù),該函數(shù)創(chuàng)建綁定到地址(2元組 )的TCP套接字并返回套接字對(duì)象。(host, port)

家庭應(yīng)該是AF_INET或AF_INET6。 backlog是傳遞給的隊(duì)列大小socket.listen();當(dāng)0 選擇了默認(rèn)合理的值。 redirect_port指示是否設(shè)置SO_REUSEPORT套接字選項(xiàng)。

如果dualstack_ipv6為true且平臺(tái)支持它,則套接字將能夠接受IPv4和IPv6連接,否則它將引發(fā) ValueError。大多數(shù)POSIX平臺(tái)和Windows應(yīng)該支持此功能。啟用此功能后,socket.getpeername()發(fā)生IPv4連接時(shí)返回的地址 將是表示為映射到IPv4的IPv6地址的IPv6地址。如果dualstack_ipv6為false,它將在默認(rèn)啟用該功能的平臺(tái)(例如Linux)上顯式禁用此功能。該參數(shù)可以與has_dualstack_ipv6()以下命令結(jié)合使用:

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平臺(tái)上,SO_REUSEADDR設(shè)置socket選項(xiàng)是為了立即重用以前的套接字,這些套接字綁定在同一地址上 并保持TIME_WAIT狀態(tài)。
3.8 新版功能.

socket.has_dualstack_ipv6()
True如果平臺(tái)支持創(chuàng)建可以處理IPv4和IPv6連接的TCP套接字,則返回。

3.8 新版功能.

socket.fromfd(fd,family,type,proto = 0 )
復(fù)制文件描述符fd(由文件對(duì)象的fileno()方法返回的整數(shù) ),并根據(jù)結(jié)果構(gòu)建套接字對(duì)象。地址族,套接字類型和協(xié)議號(hào)與上述socket()功能相同。文件描述符應(yīng)引用一個(gè)套接字,但未選中---如果文件描述符無(wú)效,則對(duì)該對(duì)象的后續(xù)操作可能會(huì)失敗。很少需要此函數(shù),但是可以使用該函數(shù)在作為標(biāo)準(zhǔn)輸入或輸出(例如由Unix inet守護(hù)程序啟動(dòng)的服務(wù)器)傳遞給程序的套接字上獲取或設(shè)置套接字選項(xiàng)。假定該套接字處于阻止模式。

新創(chuàng)建的套接字是不可繼承的。

在 3.4 版更改: The returned socket is now non-inheritable.

socket.fromshare(數(shù)據(jù))
根據(jù)從該socket.share() 方法獲得的數(shù)據(jù)實(shí)例化套接字。假定該套接字處于阻止模式。

可用性: Windows。

3.3 新版功能.

socket.SocketType
這是一個(gè)表示套接字對(duì)象類型的Python類型對(duì)象。與相同type(socket(...))。

其他功能
該socket模塊還提供各種與網(wǎng)絡(luò)相關(guān)的服務(wù):

socket.close(fd )
關(guān)閉套接字文件描述符。就像os.close(),但是用于套接字。在某些平臺(tái)上(最引人注目的Windows)os.close() 不適用于套接字文件描述符。

3.7 新版功能.

socket.getaddrinfo(host,port,family = 0,type = 0,proto = 0,flags = 0 )
將主機(jī) / 端口參數(shù)轉(zhuǎn)換為5元組的序列,其中包含創(chuàng)建連接到該服務(wù)的套接字所需的所有必要參數(shù)。 host是域名,是IPv4 / v6地址或的字符串表示形式None。port是一個(gè)字符串服務(wù)名稱,例如'http'數(shù)字端口號(hào)或None。通過(guò)傳遞host 和portNone的值,您可以傳遞給基礎(chǔ)C API。NULL

該家族,類型和原參數(shù)可以以縮小返回的地址的列表中隨意指定的。為這些參數(shù)中的每個(gè)參數(shù)傳遞零作為值將選擇整個(gè)結(jié)果范圍。該標(biāo)志參數(shù)可以是一個(gè)或幾個(gè)的AI_*常數(shù),會(huì)影響結(jié)果的方式計(jì)算并返回。例如,AI_NUMERICHOST如果主機(jī)是域名,將禁用域名解析并引發(fā)錯(cuò)誤。

該函數(shù)返回具有以下結(jié)構(gòu)的5元組列表:

(family, type, proto, canonname, sockaddr)

在這些元組中,family,type,proto都是整數(shù),并打算傳遞給socket()函數(shù)。 如果 屬于flags參數(shù),canonname將是代表主機(jī)規(guī)范名稱的字符串;否則canonname 將為空。 sockaddr是一個(gè)描述套接字地址的元組,其格式取決于返回的族(表示為2個(gè)元組 ,表示為4個(gè)元組 ),并打算傳遞給該 方法。AI_CANONNAME(address, port)AF_INET(address, port, flow info, scope id)AF_INET6socket.connect()

發(fā)起一個(gè)審計(jì)事件 socket.getaddrinfo帶參數(shù)host,port,family,type,protocol。

下面的示例為example.org端口80上的虛擬TCP連接獲取地址信息(如果未啟用IPv6,則系統(tǒng)上的結(jié)果可能會(huì)有所不同):

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版更改中:對(duì)于IPv6多播地址,表示地址的字符串將不包含%scope部分。

socket.getfqdn([name])
返回的一個(gè)完全合格的域名名稱。如果name省略或?yàn)榭眨瑒t將其解釋為本地主機(jī)。要查找標(biāo)準(zhǔn)名稱,請(qǐng)gethostbyaddr()檢查由返回的主機(jī)名,然后是主機(jī)的別名(如果有)。選擇包含句點(diǎn)的名字。如果沒(méi)有完全限定的域名可用,則返回由gethostname()返回的主機(jī)名 。

socket.gethostbyname(主機(jī)名)
將主機(jī)名轉(zhuǎn)換為IPv4地址格式。IPv4地址以字符串形式返回,例如 '100.50.200.5'。如果主機(jī)名本身是IPv4地址,則返回原樣。請(qǐng)參閱gethostbyname_ex()以獲得更完整的界面。gethostbyname()不支持IPv6名稱解析, getaddrinfo()應(yīng)將其用于IPv4 / v6雙堆棧支持。

使用參數(shù)引發(fā)審核事件 。socket.gethostbynamehostname

socket.gethostbyname_ex(主機(jī)名)
將主機(jī)名轉(zhuǎn)換為IPv4地址格式的擴(kuò)展接口。返回一個(gè)三元組,其中主機(jī)名是響應(yīng)給定ip_address的主要主機(jī)名,別名列表是同一地址的替代主機(jī)名的列表(可能為空),而ipaddrlist是同一主機(jī)上同一接口的IPv4地址的列表(通常但并非總是一個(gè)地址)。不支持IPv6名稱解析,應(yīng)將其用于IPv4 / v6雙堆棧支持。(hostname, aliaslist, ipaddrlist)gethostbyname_ex()getaddrinfo()

使用參數(shù)引發(fā)審核事件 。socket.gethostbynamehostname

socket.gethostname()
返回一個(gè)字符串,其中包含Python解釋器當(dāng)前正在執(zhí)行的機(jī)器的主機(jī)名。

引發(fā)不帶參數(shù)的審核事件 socket.gethostname。

注意:gethostname()并非總是返回完全限定的域名;使用getfqdn()了點(diǎn)。

socket.gethostbyaddr(ip_address )
返回一個(gè)三元組,其中主機(jī)名是響應(yīng)給定ip_address的主要主機(jī)名,別名列表是同一地址的備用主機(jī)名的列表(可能為空),而 ipaddrlist是同一接口上同一接口的IPv4 / v6地址的列表主機(jī)(最有可能只包含一個(gè)地址)。要查找完全合格的域名,請(qǐng)使用功能。同時(shí)支持IPv4和IPv6。(hostname, aliaslist, ipaddrlist)getfqdn()gethostbyaddr()

使用參數(shù)引發(fā)審核事件 。socket.gethostbyaddrip_address

socket.getnameinfo(sockaddr,標(biāo)志)
將套接字地址sockaddr轉(zhuǎn)換為2元組。根據(jù)標(biāo)志的設(shè)置,結(jié)果可以在host中包含標(biāo)準(zhǔn)域名或數(shù)字地址表示形式。同樣,端口可以包含字符串端口名稱或數(shù)字端口號(hào)。(host, port)

對(duì)于IPv6地址,%scope如果sockaddr 包含有意義的scopeid,則將其附加到主機(jī)部分。通常,這種情況發(fā)生在多播地址上。

有關(guān)標(biāo)志的更多信息,請(qǐng)查閱getnameinfo(3)。

使用參數(shù)引發(fā)審核事件 。socket.getnameinfosockaddr

socket.getprotobyname(協(xié)議名)
將Internet協(xié)議名稱(例如'icmp')轉(zhuǎn)換為適合作為(可選的)第三個(gè)參數(shù)傳遞給socket() 函數(shù)的常量。通常只有在“原始”模式(SOCK_RAW)中打開(kāi)的套接字才需要使用此方法。對(duì)于正常的套接字模式,如果協(xié)議省略或?yàn)榱悖瑒t會(huì)自動(dòng)選擇正確的協(xié)議。

socket.getservbyname(servicename [,protocolname ] )
將Internet服務(wù)名稱和協(xié)議名稱轉(zhuǎn)換為該服務(wù)的端口號(hào)。可選協(xié)議名稱(如果提供)應(yīng)為'tcp'或 'udp',否則任何協(xié)議都將匹配。

發(fā)起一個(gè)審計(jì)事件 socket.getservbyname帶有參數(shù)servicename,protocolname。

socket.getservbyport(port [,protocolname ] )
將Internet端口號(hào)和協(xié)議名稱轉(zhuǎn)換為該服務(wù)的服務(wù)名稱。可選協(xié)議名稱(如果提供)應(yīng)為'tcp'或 'udp',否則任何協(xié)議都將匹配。

發(fā)起一個(gè)審計(jì)事件 socket.getservbyport帶有參數(shù)port,protocolname。

socket.ntohl(x )
將32位正整數(shù)從網(wǎng)絡(luò)轉(zhuǎn)換為主機(jī)字節(jié)順序。在主機(jī)字節(jié)順序與網(wǎng)絡(luò)字節(jié)順序相同的計(jì)算機(jī)上,這是一個(gè)空操作;否則,它將執(zhí)行4字節(jié)交換操作。

socket.ntohs(x )
將16位正整數(shù)從網(wǎng)絡(luò)轉(zhuǎn)換為主機(jī)字節(jié)順序。在主機(jī)字節(jié)順序與網(wǎng)絡(luò)字節(jié)順序相同的計(jì)算機(jī)上,這是一個(gè)空操作;否則,它將執(zhí)行2字節(jié)交換操作。

3.7版后已可移除:如果x不適合16位無(wú)符號(hào)整數(shù),但適合正C int,則將其靜默截?cái)酁?6位無(wú)符號(hào)整數(shù)。不推薦使用此靜音截?cái)喙δ?,它將在將?lái)的Python版本中引發(fā)異常。

socket.htonl(x )
將32位正整數(shù)從主機(jī)轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序。在主機(jī)字節(jié)順序與網(wǎng)絡(luò)字節(jié)順序相同的計(jì)算機(jī)上,這是一個(gè)空操作;否則,它將執(zhí)行4字節(jié)交換操作。

socket.htons(x )
將主機(jī)的16位正整數(shù)轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序。在主機(jī)字節(jié)順序與網(wǎng)絡(luò)字節(jié)順序相同的計(jì)算機(jī)上,這是一個(gè)空操作;否則,它將執(zhí)行2字節(jié)交換操作。

3.7版后已可移除:如果x不適合16位無(wú)符號(hào)整數(shù),但適合正C int,則將其靜默截?cái)酁?6位無(wú)符號(hào)整數(shù)。不推薦使用此靜音截?cái)喙δ?,它將在將?lái)的Python版本中引發(fā)異常。

socket.inet_aton(ip_string )
將IPv4地址從點(diǎn)分四進(jìn)制字符串格式(例如'123.45.67.89')轉(zhuǎn)換為32位壓縮二進(jìn)制格式,作為字節(jié)對(duì)象,長(zhǎng)度為四個(gè)字符。與使用標(biāo)準(zhǔn)C庫(kù)并需要type對(duì)象的程序進(jìn)行對(duì)話時(shí),此功能非常有用,該對(duì)象是此函數(shù)返回的32位壓縮二進(jìn)制文件的C類型。struct in_addr

inet_aton()還接受少于三個(gè)點(diǎn)的字符串;有關(guān)詳細(xì)信息,請(qǐng)參見(jiàn)Unix手冊(cè)頁(yè)inet(3)。

如果傳遞給此功能的IPv4地址字符串無(wú)效, OSError則會(huì)引發(fā)。請(qǐng)注意,確切有效的內(nèi)容取決于的基礎(chǔ)C實(shí)現(xiàn)inet_aton()。

inet_aton()不支持IPv6,而inet_pton()應(yīng)改為用于IPv4 / v6雙堆棧支持。

socket.inet_ntoa(packed_ip )
將32位壓縮的IPv4地址(類似字節(jié)的對(duì)象,長(zhǎng)度為4個(gè)字節(jié))轉(zhuǎn)換為其標(biāo)準(zhǔn)的點(diǎn)分四進(jìn)制字符串表示形式(例如'123.45.67.89')。與使用標(biāo)準(zhǔn)C庫(kù)并需要type對(duì)象的程序進(jìn)行對(duì)話時(shí),此功能很有用。該對(duì)象是此函數(shù)作為參數(shù)的32位打包二進(jìn)制數(shù)據(jù)的C類型。struct in_addr

如果傳遞給此函數(shù)的字節(jié)序列的長(zhǎng)度不完全是4個(gè)字節(jié),OSError將被引發(fā)。inet_ntoa()不支持IPv6,而inet_ntop()應(yīng)改為用于IPv4 / v6雙堆棧支持。

在 3.5 版更改: 現(xiàn)在支持可寫(xiě)的 字節(jié)類對(duì)象。

socket.inet_pton(address_family,ip_string )
將IP地址從其特定于家庭的字符串格式轉(zhuǎn)換為壓縮的二進(jìn)制格式。inet_pton()當(dāng)庫(kù)或網(wǎng)絡(luò)協(xié)議調(diào)用類型(類似于 )或的對(duì)象時(shí),此功能很有用。struct in_addrinet_aton()struct in6_addr

為支持的值address_family當(dāng)前AF_INET和 AF_INET6。如果IP地址字符串ip_string無(wú)效, OSError則會(huì)引發(fā)。請(qǐng)注意,確切有效的內(nèi)容取決于address_family的值和的基礎(chǔ)實(shí)現(xiàn) inet_pton()。

可用性:Unix(可能不是所有平臺(tái)),Windows。

在 3.4 版更改: Windows support added

socket.inet_ntop(address_family,packed_ip )
將壓縮的IP地址(字節(jié)大小的類似字節(jié)的對(duì)象)轉(zhuǎn)換為其標(biāo)準(zhǔn)的,特定于家庭的字符串表示形式(例如'7.10.0.5'或'5aef:2b::8')。 inet_ntop()當(dāng)庫(kù)或網(wǎng)絡(luò)協(xié)議返回類型(類似于)或 的對(duì)象時(shí),此功能很有用。struct in_addrinet_ntoa()struct in6_addr

為支持的值address_family當(dāng)前AF_INET和 AF_INET6。如果字節(jié)對(duì)象packed_ip對(duì)于指定的地址系列而言不是正確的長(zhǎng)度,ValueError則會(huì)引發(fā)。 OSError因調(diào)用導(dǎo)致錯(cuò)誤而引發(fā)inet_ntop()。

可用性:Unix(可能不是所有平臺(tái)),Windows。

在 3.4 版更改: Windows support added

在 3.5 版更改: 現(xiàn)在支持可寫(xiě)的 字節(jié)類對(duì)象。

socket.CMSG_LEN(長(zhǎng)度)
返回帶有給定長(zhǎng)度的關(guān)聯(lián)數(shù)據(jù)的輔助數(shù)據(jù)項(xiàng)的總長(zhǎng)度(不帶尾部填充)。此值通常可用作recvmsg()接收單個(gè)輔助數(shù)據(jù)項(xiàng)的緩沖區(qū)大小,但是RFC 3542要求使用可移植的應(yīng)用程序CMSG_SPACE(),因此包括填充空間,即使該項(xiàng)將是緩沖區(qū)中的最后一項(xiàng)也是如此。OverflowError如果 length超出值的允許范圍,則引發(fā)。

可用性:大多數(shù)Unix平臺(tái),可能還有其他平臺(tái)。

3.3 新版功能.

socket.CMSG_SPACE(長(zhǎng)度)
返回用于recvmsg()接收帶有給定長(zhǎng)度的關(guān)聯(lián)數(shù)據(jù)的輔助數(shù)據(jù)項(xiàng) 以及任何尾隨填充所需的緩沖區(qū)大小。接收多個(gè)項(xiàng)目所需的緩沖區(qū)空間是CMSG_SPACE() 其關(guān)聯(lián)數(shù)據(jù)長(zhǎng)度的值之和。OverflowError如果length超出值的允許范圍,則引發(fā) 。

請(qǐng)注意,某些系統(tǒng)可能不提供此功能就支持輔助數(shù)據(jù)。還要注意,使用此功能的結(jié)果來(lái)設(shè)置緩沖區(qū)大小可能不會(huì)精確地限制可以接收的輔助數(shù)據(jù)量,因?yàn)槠渌麛?shù)據(jù)可能會(huì)適合填充區(qū)域。

可用性:大多數(shù)Unix平臺(tái),可能還有其他平臺(tái)。

3.3 新版功能.

socket.getdefaulttimeout()
返回新套接字對(duì)象的默認(rèn)超時(shí)(以秒為單位)(浮動(dòng))。值None表示新的套接字對(duì)象沒(méi)有超時(shí)。首次導(dǎo)入套接字模塊時(shí),默認(rèn)值為None。

socket.setdefaulttimeout(超時(shí))
為新的套接字對(duì)象設(shè)置默認(rèn)超時(shí)(以秒為單位)(浮動(dòng))。首次導(dǎo)入套接字模塊時(shí),默認(rèn)值為None。請(qǐng)參閱 settimeout()以獲取可能的值及其各自的含義。

socket.sethostname(name)
將機(jī)器的主機(jī)名設(shè)置為name。OSError如果您沒(méi)有足夠的權(quán)限,則會(huì)引發(fā) 。

使用參數(shù)引發(fā)審核事件 。socket.sethostnamename

可用性:Unix。

3.3 新版功能.

socket.if_nameindex()
返回網(wǎng)絡(luò)接口信息(索引int,名稱字符串)元組的列表。 OSError如果系統(tǒng)調(diào)用失敗。

可用性: Unix, Windows。

3.3 新版功能.

在 3.8 版更改: Windows support was added.

socket.if_nametoindex(if_name )
返回與接口名稱相對(duì)應(yīng)的網(wǎng)絡(luò)接口索引號(hào)。 OSError如果不存在具有給定名稱的接口。

可用性: Unix, Windows。

3.3 新版功能.

在 3.8 版更改: Windows support was added.

socket.if_indextoname(if_index )
返回與接口索引號(hào)相對(duì)應(yīng)的網(wǎng)絡(luò)接口名稱。 OSError如果不存在具有給定索引的接口。

可用性: Unix, Windows。

3.3 新版功能.

在 3.8 版更改: Windows support was added.

socket對(duì)象
套接字對(duì)象具有以下方法。除之外 makefile(),它們對(duì)應(yīng)于適用于套接字的Unix系統(tǒng)調(diào)用。

在3.2版更改中:添加了對(duì)上下文管理器協(xié)議的支持。退出上下文管理器等同于調(diào)用close()。

socket.accept()
接受連接。套接字必須綁定到一個(gè)地址并監(jiān)聽(tīng)連接。返回值是一對(duì),其中conn是可用于在連接上發(fā)送和接收數(shù)據(jù)的 新套接字對(duì)象,而 address是綁定到連接另一端上的套接字的地址。(conn, address)

新創(chuàng)建的套接字是不可繼承的。

在 3.4 版更改: The socket is now non-inheritable.

在3.5版更改:如果系統(tǒng)調(diào)用被中斷并且信號(hào)處理程序沒(méi)有引發(fā)異常,則該方法現(xiàn)在重試系統(tǒng)調(diào)用而不是引發(fā)InterruptedError異常(請(qǐng)參見(jiàn)PEP 475)。

socket.bind(地址)
將套接字綁定到address。套接字必須尚未綁定。(地址的格式取決于地址系列---見(jiàn)上文。)

發(fā)起一個(gè)審計(jì)事件 socket.bind帶有參數(shù)self,address。

socket.close()
將插座標(biāo)記為關(guān)閉。當(dāng)來(lái)自makefile() 中的所有文件對(duì)象都關(guān)閉時(shí),基礎(chǔ)系統(tǒng)資源(例如文件描述符)也將關(guān)閉。一旦發(fā)生這種情況,套接字對(duì)象上的所有將來(lái)操作都會(huì)失敗。遠(yuǎn)端將不再接收任何數(shù)據(jù)(在清除排隊(duì)的數(shù)據(jù)之后)。

套接字在被垃圾回收時(shí)會(huì)自動(dòng)關(guān)閉,但建議close()顯式建議使用套接字,或在其with周圍使用 語(yǔ)句。

在3.6版更改:OSError現(xiàn)在在進(jìn)行基礎(chǔ)close()調(diào)用時(shí)發(fā)生錯(cuò)誤時(shí)引發(fā) 。

注解 close()釋放與連接關(guān)聯(lián)的資源,但不一定立即關(guān)閉連接。如果你想關(guān)閉及時(shí)連接,調(diào)用shutdown() 之前close()。
socket.connect(地址)
連接到地址為的遠(yuǎn)程套接字。(地址的格式取決于地址系列---見(jiàn)上文。)

如果連接被信號(hào)中斷,則該方法將等待直到連接完成,或者socket.timeout如果信號(hào)處理程序未引發(fā)異常并且套接字正在阻塞或發(fā)生超時(shí),則引發(fā)on超時(shí)。對(duì)于非阻塞套接字,InterruptedError如果連接被信號(hào)中斷(或者信號(hào)處理程序引發(fā)的異常),則該方法引發(fā) 異常。

發(fā)起一個(gè)審計(jì)事件 socket.connect帶有參數(shù)self,address。

在3.5版更改:該方法現(xiàn)在等待直到連接完成,而不是 InterruptedError如果連接被信號(hào)中斷,信號(hào)處理程序沒(méi)有引發(fā)異常并且套接字正在阻塞或具有超時(shí),則引發(fā)異常(請(qǐng)參見(jiàn)PEP 475)。

socket.connect_ex(地址)
與相似connect(address),但是返回錯(cuò)誤指示符而不是針對(duì)C級(jí)connect()調(diào)用返回的錯(cuò)誤引發(fā)異常(其他問(wèn)題,例如“找不到主機(jī)”仍然可以引發(fā)異常)。錯(cuò)誤指示符是0操作是否成功,否則為errno變量的值 。這對(duì)于支持例如異步連接很有用。

發(fā)起一個(gè)審計(jì)事件 socket.connect帶有參數(shù)self,address。

socket.detach()
將套接字對(duì)象置于關(guān)閉狀態(tài),而無(wú)需實(shí)際關(guān)閉基礎(chǔ)文件描述符。返回文件描述符,并且可以將其重新用于其他目的。

3.2 新版功能.

socket.dup()
復(fù)制套接字。

新創(chuàng)建的套接字是不可繼承的。

在 3.4 版更改: The socket is now non-inheritable.

socket.fileno()
返回套接字的文件描述符(一個(gè)小整數(shù)),如果失敗,則返回-1。這對(duì)于很有用select.select()。

在Windows下,不能在可以使用文件描述符的地方使用此方法返回的小整數(shù)(例如os.fdopen())。Unix沒(méi)有此限制。

socket.get_inheritable()
獲取套接字文件描述符或套接字句柄的可繼承標(biāo)志:True如果套接字可以在子進(jìn)程中繼承,F(xiàn)alse則不能。

3.4 新版功能.

socket.getpeername()
返回套接字連接到的遠(yuǎn)程地址。例如,這對(duì)于查找遠(yuǎn)程IPv4 / v6套接字的端口號(hào)很有用。(返回的地址格式取決于地址系列---參見(jiàn)上文。)在某些系統(tǒng)上,不支持此功能。

socket.getsockname()
返回套接字自己的地址。例如,這對(duì)于查找IPv4 / v6套接字的端口號(hào)很有用。(返回的地址格式取決于地址系列---參見(jiàn)上文。)

socket.getsockopt(level,optname [,buflen ] )
返回給定套接字選項(xiàng)的值(請(qǐng)參見(jiàn)Unix手冊(cè)頁(yè) getsockopt(2))。所需的符號(hào)常量(SO_*等)在此模塊中定義。如果不存在buflen,則假定為整數(shù)選項(xiàng),并且該整數(shù)值由函數(shù)返回。如果存在buflen,則它指定用于接收選項(xiàng)的緩沖區(qū)的最大長(zhǎng)度,并且此緩沖區(qū)作為字節(jié)對(duì)象返回。由調(diào)用者決定是否對(duì)緩沖區(qū)的內(nèi)容進(jìn)行解碼(有關(guān)struct解碼編碼為字節(jié)字符串的C結(jié)構(gòu)的方法,請(qǐng)參見(jiàn)可選的內(nèi)置模塊)。

socket.getblocking()
True如果套接字處于阻塞模式,F(xiàn)alse則返回;如果處于非阻塞狀態(tài),則返回。

這相當(dāng)于檢查。socket.gettimeout() == 0

3.7 新版功能.

socket.gettimeout()
返回與套接字操作相關(guān)的超時(shí)(以秒為單位)(浮動(dòng)),或者None如果未設(shè)置超時(shí),則返回。這反映了對(duì)setblocking()或的最后一次呼叫 settimeout()。

socket.ioctl(control,option )
平臺(tái)
視窗

該ioctl()方法是WSAIoctl系統(tǒng)接口的受限接口。請(qǐng)參考Win32文檔以獲取更多信息。

在其他平臺(tái)上, 可以使用泛型fcntl.fcntl()和fcntl.ioctl()功能。他們接受套接字對(duì)象作為第一個(gè)參數(shù)。

目前,只有下面的控制代碼的支持: SIO_RCVALL,SIO_KEEPALIVE_VALS,和SIO_LOOPBACK_FAST_PATH。

在 3.6 版更改: SIO_LOOPBACK_FAST_PATH was added.

socket.listen([ 積壓] )
啟用服務(wù)器以接受連接。如果指定了積壓,則必須至少為0(如果較低,則將其設(shè)置為0);否則,必須為0。它指定系統(tǒng)在拒絕新連接之前允許的不可接受的連接數(shù)。如果未指定,則選擇默認(rèn)的合理值。

在 3.5 版更改: The backlog parameter is now optional.

socket.makefile(mode ='r',buffering = None,*,encoding = None,errors = None,newline = None )
返回與套接字關(guān)聯(lián)的文件對(duì)象。確切的返回類型取決于賦予的參數(shù)makefile()。這些參數(shù)的解釋方式與內(nèi)置open()函數(shù)相同,只是唯一支持的模式值是'r'(默認(rèn))'w'和'b'。

套接字必須處于阻止模式;它可能會(huì)超時(shí),但是如果發(fā)生超時(shí),文件對(duì)象的內(nèi)部緩沖區(qū)可能會(huì)以不一致的狀態(tài)結(jié)束。

makefile()除非所有其他文件對(duì)象都已關(guān)閉并且socket.close()已在套接字對(duì)象上調(diào)用,否則關(guān)閉由返回的文件對(duì)象不會(huì)關(guān)閉原始套接字 。

注解 在Windows上,makefile()無(wú)法在需要帶有文件描述符的文件對(duì)象(例如的流參數(shù))使用創(chuàng)建的類似文件的對(duì)象subprocess.Popen()。
socket.recv(bufsize [,flags ] )
從套接字接收數(shù)據(jù)。返回值是一個(gè)字節(jié)對(duì)象,代表接收到的數(shù)據(jù)。一次要接收的最大數(shù)據(jù)量由bufsize指定。有關(guān)可選參數(shù)標(biāo)志的含義,請(qǐng)參見(jiàn)Unix手冊(cè)頁(yè)recv(2);它默認(rèn)為零。

注解 為了與硬件和網(wǎng)絡(luò)實(shí)際情況進(jìn)行最佳匹配,bufsize的值 應(yīng)為2的相對(duì)較小的冪,例如4096。
在3.5版更改:如果系統(tǒng)調(diào)用被中斷并且信號(hào)處理程序沒(méi)有引發(fā)異常,則該方法現(xiàn)在重試系統(tǒng)調(diào)用而不是引發(fā)InterruptedError異常(請(qǐng)參見(jiàn)PEP 475)。

socket.recvfrom(bufsize [,flags ] )
從套接字接收數(shù)據(jù)。返回值是一對(duì) ,其中bytes是表示接收到的數(shù)據(jù)的字節(jié)對(duì)象,而address是發(fā)送數(shù)據(jù)的套接字的地址。有關(guān)可選參數(shù)標(biāo)志的含義,請(qǐng)參見(jiàn)Unix手冊(cè)頁(yè) recv(2);它默認(rèn)為零。(地址的格式取決于地址系列---見(jiàn)上文。)(bytes, address)

在3.5版更改:如果系統(tǒng)調(diào)用被中斷并且信號(hào)處理程序沒(méi)有引發(fā)異常,則該方法現(xiàn)在重試系統(tǒng)調(diào)用而不是引發(fā)InterruptedError異常(請(qǐng)參見(jiàn)PEP 475)。

在3.7版更改:對(duì)于IPv6組播地址的第一個(gè)項(xiàng)目地址不包含 %scope一部分了。為了獲得完整的IPv6地址,請(qǐng)使用 getnameinfo()。

socket.recvmsg(bufsize [,ancbufsize [,flags ] ] )
從套接字接收普通數(shù)據(jù)(最多bufsize字節(jié))和輔助數(shù)據(jù)。所述ancbufsize參數(shù)設(shè)置在用于接收的輔助數(shù)據(jù)的內(nèi)部緩沖區(qū)的字節(jié)大小; 它默認(rèn)為0,表示將不會(huì)接收任何輔助數(shù)據(jù)。可以使用CMSG_SPACE()或來(lái)計(jì)算輔助數(shù)據(jù)的適當(dāng)緩沖區(qū)大小, CMSG_LEN()不適合緩沖區(qū)的項(xiàng)目可能會(huì)被截?cái)嗷騺G棄。該標(biāo)志 參數(shù)默認(rèn)為0,有用法相同 recv()。

返回值為4元組:。該數(shù)據(jù)項(xiàng)是一個(gè)保持接收到的非輔助性的數(shù)據(jù)對(duì)象。該ancdata項(xiàng)是零個(gè)或多個(gè)元組的列表表示接收的輔助數(shù)據(jù)(控制消息):cmsg_level和 cmsg_type分別指定協(xié)議級(jí)和協(xié)議特定的類型整數(shù),且cmsg_data是 保持相關(guān)聯(lián)的數(shù)據(jù)對(duì)象。該msg_flags 項(xiàng)是按位或的各種標(biāo)志指示在接收到的消息的條件; 有關(guān)詳細(xì)信息,請(qǐng)參見(jiàn)系統(tǒng)文檔。如果接收插座未連接,則地址(data, ancdata, msg_flags, address)bytes(cmsg_level, cmsg_type, cmsg_data)bytes是發(fā)送套接字的地址(如果有);否則,其值未指定。

在某些系統(tǒng),sendmsg()并且recvmsg()可以被用于在一個(gè)進(jìn)程之間傳遞文件描述符AF_UNIX 插座。使用此功能時(shí)(通常僅限于 SOCK_STREAM套接字),recvmsg()它將在其輔助數(shù)據(jù)中返回形式為的項(xiàng),其中fds是一個(gè)對(duì)象,該對(duì)象將新文件描述符表示為本機(jī)C 類型的二進(jìn)制數(shù)組。如果在系統(tǒng)調(diào)用返回后引發(fā)異常,它將首先嘗試關(guān)閉通過(guò)此機(jī)制接收到的所有文件描述符。(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds)bytesintrecvmsg()

一些系統(tǒng)沒(méi)有指示僅部分接收到的輔助數(shù)據(jù)項(xiàng)的截短長(zhǎng)度。如果某項(xiàng)似乎超出了緩沖區(qū)的末尾,recvmsg()則將發(fā)出一個(gè)RuntimeWarning,并返回其在緩沖區(qū)內(nèi)的部分,前提是該對(duì)象在關(guān)聯(lián)數(shù)據(jù)開(kāi)始之前沒(méi)有被截?cái)唷?/p>

在支持該SCM_RIGHTS機(jī)制的系統(tǒng)上,以下函數(shù)將最多接收maxfds文件描述符,返回消息數(shù)據(jù)和包含描述符的列表(同時(shí)忽略意外條件,例如接收到無(wú)關(guān)的控制消息)。另請(qǐng)參閱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)
可用性:大多數(shù)Unix平臺(tái),可能還有其他平臺(tái)。

3.3 新版功能.

在3.5版更改:如果系統(tǒng)調(diào)用被中斷并且信號(hào)處理程序沒(méi)有引發(fā)異常,則該方法現(xiàn)在重試系統(tǒng)調(diào)用而不是引發(fā)InterruptedError異常(請(qǐng)參見(jiàn)PEP 475)。

socket.recvmsg_into(緩沖區(qū)[,ancbufsize [,標(biāo)志] ] )
以正常方式從套接字接收普通數(shù)據(jù)和輔助數(shù)據(jù) recvmsg(),但將非輔助數(shù)據(jù)分散到一系列緩沖區(qū)中,而不是返回新的字節(jié)對(duì)象。所述 緩沖器參數(shù)必須是可迭代的對(duì)象,出口可寫(xiě)緩沖液(例如bytearray對(duì)象); 它們將被連續(xù)的非輔助數(shù)據(jù)塊填充,直到全部被寫(xiě)入或不再有緩沖區(qū)為止。操作系統(tǒng)可以設(shè)置可以使用的緩沖區(qū)數(shù)的限制(sysconf()值SC_IOV_MAX)。該ancbufsize和 標(biāo)志參數(shù)的含義為相同recvmsg()。

返回值是一個(gè)4元組:,其中nbytes是寫(xiě)入緩沖區(qū)的非輔助數(shù)據(jù)的字節(jié)總數(shù),并且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---')]
可用性:大多數(shù)Unix平臺(tái),可能還有其他平臺(tái)。

3.3 新版功能.

socket.recvfrom_into(buffer [,nbytes [,flags ] ] )
從套接字接收數(shù)據(jù),將其寫(xiě)入緩沖區(qū),而不是創(chuàng)建新的字節(jié)串。返回值是一對(duì),其中nbytes是接收的字節(jié)數(shù),address是發(fā)送數(shù)據(jù)的套接字的地址。有關(guān)可選參數(shù)標(biāo)志的含義,請(qǐng)參見(jiàn)Unix手冊(cè)頁(yè)recv(2);它默認(rèn)為零。(地址的格式 取決于地址系列---見(jiàn)上文。)(nbytes, address)

socket.recv_into(buffer [,nbytes [,flags ] ] )
從套接字接收最多nbytes個(gè)字節(jié),將數(shù)據(jù)存儲(chǔ)到緩沖區(qū)中,而不是創(chuàng)建一個(gè)新的字節(jié)串。如果未指定nbytes(或0),則接收給定緩沖區(qū)中的可用大小。返回接收到的字節(jié)數(shù)。有關(guān)可選參數(shù)標(biāo)志的含義,請(qǐng)參見(jiàn)Unix手冊(cè)頁(yè)recv(2);它默認(rèn)為零。

socket.send(字節(jié)[,標(biāo)志] )
將數(shù)據(jù)發(fā)送到套接字。該套接字必須連接到遠(yuǎn)程套接字??蛇x標(biāo)志參數(shù)的含義與recv()上述含義相同。返回發(fā)送的字節(jié)數(shù)。應(yīng)用程序負(fù)責(zé)檢查所有數(shù)據(jù)是否已發(fā)送;如果僅傳輸了一些數(shù)據(jù),則應(yīng)用程序需要嘗試傳送其余數(shù)據(jù)。有關(guān)此主題的更多信息,請(qǐng)查閱《通用編程指南》。

在3.5版更改:如果系統(tǒng)調(diào)用被中斷并且信號(hào)處理程序沒(méi)有引發(fā)異常,則該方法現(xiàn)在重試系統(tǒng)調(diào)用而不是引發(fā)InterruptedError異常(請(qǐng)參見(jiàn)PEP 475)。

socket.sendall(字節(jié)[,標(biāo)志] )
將數(shù)據(jù)發(fā)送到套接字。該套接字必須連接到遠(yuǎn)程套接字??蛇x標(biāo)志參數(shù)的含義與recv()上述含義相同。與send()方法不同,此方法繼續(xù)從字節(jié)發(fā)送數(shù)據(jù),直到發(fā)送完所有數(shù)據(jù)或發(fā)生錯(cuò)誤為止。 None成功返回。如果出錯(cuò),則會(huì)引發(fā)異常,并且無(wú)法確定成功發(fā)送了多少數(shù)據(jù)(如果有)。

在3.5版更改:每次成功發(fā)送數(shù)據(jù)后,套接字超時(shí)不再重置。現(xiàn)在,套接字超時(shí)是發(fā)送所有數(shù)據(jù)的最大總持續(xù)時(shí)間。

在3.5版更改:如果系統(tǒng)調(diào)用被中斷并且信號(hào)處理程序沒(méi)有引發(fā)異常,則該方法現(xiàn)在重試系統(tǒng)調(diào)用而不是引發(fā)InterruptedError異常(請(qǐng)參見(jiàn)PEP 475)。

socket.sendto(字節(jié),地址)
socket.sendto(字節(jié),標(biāo)志,地址)
將數(shù)據(jù)發(fā)送到套接字。該套接字不應(yīng)連接到遠(yuǎn)程套接字,因?yàn)槟繕?biāo)套接字是由address指定的??蛇x標(biāo)志 參數(shù)的含義與recv()上述含義相同。返回發(fā)送的字節(jié)數(shù)。(地址的格式取決于地址系列---見(jiàn)上文。)

發(fā)起一個(gè)審計(jì)事件 socket.sendto帶有參數(shù)self,address。

在3.5版更改:如果系統(tǒng)調(diào)用被中斷并且信號(hào)處理程序沒(méi)有引發(fā)異常,則該方法現(xiàn)在重試系統(tǒng)調(diào)用而不是引發(fā)InterruptedError異常(請(qǐng)參見(jiàn)PEP 475)。

socket.sendmsg(緩沖區(qū)[,ancdata [,標(biāo)志[,地址] ] ] )
將普通數(shù)據(jù)和輔助數(shù)據(jù)發(fā)送到套接字,從一系列緩沖區(qū)中收集非輔助數(shù)據(jù),并將其串聯(lián)為一條消息。所述緩沖器參數(shù)指定為可迭代的非輔助數(shù)據(jù) 字節(jié)狀物體 (例如bytes對(duì)象); 操作系統(tǒng)可能會(huì)設(shè)置可使用的緩沖區(qū)數(shù)的限制(sysconf()值SC_IOV_MAX)。所述ancdata參數(shù)指定所述輔助數(shù)據(jù)(控制消息),為迭代的零個(gè)或多個(gè)元組 ,其中cmsg_level和 cmsg_type分別指定協(xié)議級(jí)和協(xié)議特定的類型整數(shù),且cmsg_data(cmsg_level, cmsg_type, cmsg_data)是保存相關(guān)數(shù)據(jù)的類似字節(jié)的對(duì)象。請(qǐng)注意,某些系統(tǒng)(特別是沒(méi)有的系統(tǒng)CMSG_SPACE())可能支持每個(gè)呼叫僅發(fā)送一條控制消息。該 標(biāo)志參數(shù)默認(rèn)為0,有用法相同 send()。如果提供了address而不提供了None,它將設(shè)置消息的目標(biāo)地址。返回值是發(fā)送的非輔助數(shù)據(jù)的字節(jié)數(shù)。

以下函數(shù)在支持該機(jī)制的系統(tǒng)上, 通過(guò)套接字 發(fā)送文件描述符fds的列表。另請(qǐng)參閱。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))])
可用性:大多數(shù)Unix平臺(tái),可能還有其他平臺(tái)。

發(fā)起一個(gè)審計(jì)事件 socket.sendmsg帶有參數(shù)self,address。

3.3 新版功能.

在3.5版更改:如果系統(tǒng)調(diào)用被中斷并且信號(hào)處理程序沒(méi)有引發(fā)異常,則該方法現(xiàn)在重試系統(tǒng)調(diào)用而不是引發(fā)InterruptedError異常(請(qǐng)參見(jiàn)PEP 475)。

socket.sendmsg_afalg([ 消息,] *,對(duì)[,四[,assoclen [,標(biāo)志] ] ] )
專業(yè)版sendmsg()的AF_ALG插座。設(shè)置模式,IV,AEAD關(guān)聯(lián)的數(shù)據(jù)長(zhǎng)度和AF_ALG套接字標(biāo)志。

可用性:Linux> = 2.6.38。

3.6 新版功能.

socket.sendfile(file,offset = 0,count = None )[源代碼)
使用高性能發(fā)送文件,直到達(dá)到EOF為止, os.sendfile并返回已發(fā)送的字節(jié)總數(shù)。 文件必須是以二進(jìn)制模式打開(kāi)的常規(guī)文件對(duì)象。如果 os.sendfile不可用(例如Windows)或文件不是常規(guī)文件,send()則將使用該文件。offset告訴您從哪里開(kāi)始讀取文件。如果指定,count是要發(fā)送的字節(jié)總數(shù),而不是發(fā)送文件直到達(dá)到EOF。返回時(shí)或發(fā)生錯(cuò)誤時(shí),文件位置將更新,在這種情況下, file.tell()可以使用該位置來(lái)計(jì)算已發(fā)送的字節(jié)數(shù)。插座必須是SOCK_STREAM類型。不支持非阻塞套接字。

3.5 新版功能.

socket.set_inheritable(可繼承的)
設(shè)置套接字的文件描述符或套接字的句柄的可繼承標(biāo)志。

3.4 新版功能.

socket.setblocking(標(biāo)志)
設(shè)置套接字的阻塞或非阻塞模式:如果標(biāo)志為false,則將套接字設(shè)置為非阻塞,否則設(shè)置為阻塞模式。

此方法是某些settimeout()調(diào)用的簡(jiǎn)寫(xiě):

sock.setblocking(True) 相當(dāng)于 sock.settimeout(None)

sock.setblocking(False) 相當(dāng)于 sock.settimeout(0.0)

在 3.7 版更改: The method no longer applies SOCK_NONBLOCK flag on socket.type.

socket.settimeout(值)
在阻止套接字操作上設(shè)置超時(shí)。所述值參數(shù)可以是表達(dá)秒的非負(fù)的浮點(diǎn)數(shù),或None。如果給出一個(gè)非零值,則在該操作完成之前已超過(guò)timeout超時(shí)時(shí)間值,則隨后的套接字操作將引發(fā) 異常。如果給定零,則將套接字置于非阻塞模式。如果None給出,則套接字處于阻塞模式。

有關(guān)更多信息,請(qǐng)查閱有關(guān)套接字超時(shí)的說(shuō)明。

在 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 )
設(shè)置給定套接字選項(xiàng)的值(請(qǐng)參見(jiàn)Unix手冊(cè)頁(yè) setsockopt(2))。所需的符號(hào)常量在socket模塊(SO_*等)中定義 。該值可以是一個(gè)整數(shù), None或一個(gè)對(duì)象類字節(jié)代表一個(gè)緩沖器。在后一種情況下,由調(diào)用方確保字節(jié)串包含正確的位(有關(guān)將structC結(jié)構(gòu)編碼為字節(jié)串的方法,請(qǐng)參閱可選的內(nèi)置模塊)。當(dāng)值設(shè)置為None, optlen是必需的參數(shù)。等效于setsockopt()使用optval=NULL和調(diào)用C函數(shù)optlen=optlen。

在 3.5 版更改: 現(xiàn)在支持可寫(xiě)的 字節(jié)類對(duì)象。

在 3.6 版更改: setsockopt(level, optname, None, optlen: int) form added.

socket.shutdown(如何)
關(guān)閉連接的一半或一半。如果怎么是SHUT_RD,還接收被禁止。如果怎么是SHUT_WR,進(jìn)一步將是不允許的。如果怎么是SHUT_RDWR,進(jìn)一步的發(fā)送和接收被禁止。

socket.share(process_id )
復(fù)制套接字,并準(zhǔn)備將其與目標(biāo)進(jìn)程共享。目標(biāo)進(jìn)程必須提供有process_id。然后,可以使用某種形式的進(jìn)程間通信將結(jié)果字節(jié)對(duì)象傳遞給目標(biāo)進(jìn)程,并可以使用在那里重新創(chuàng)建套接字fromshare()。一旦調(diào)用此方法,就可以安全地關(guān)閉套接字,因?yàn)椴僮飨到y(tǒng)已經(jīng)為目標(biāo)進(jìn)程復(fù)制了該套接字。

可用性: Windows。

3.3 新版功能.

注意沒(méi)有方法read()或write(); 而是使用 recv()and send()without flags參數(shù)。

套接字對(duì)象還具有這些(只讀)屬性,這些屬性與提供給socket構(gòu)造函數(shù)的值相對(duì)應(yīng)。

socket.family
套接字家族。

socket.type
套接字類型。

socket.proto
套接字協(xié)議。

套接字超時(shí)注意事項(xiàng)
套接字對(duì)象可以處于以下三種模式之一:阻止,非阻止或超時(shí)。默認(rèn)情況下,套接字始終以阻止模式創(chuàng)建,但是可以通過(guò)調(diào)用來(lái)更改setdefaulttimeout()。

在阻止模式下,操作將阻止直到完成或系統(tǒng)返回錯(cuò)誤(例如連接超時(shí))。

在非阻塞模式下,如果操作無(wú)法立即完成,則操作將失?。ú恍业氖?,錯(cuò)誤取決于系統(tǒng)):來(lái)自的函數(shù) select可用于了解套接字何時(shí)以及是否可用于讀取或?qū)懭搿?/p>

在超時(shí)模式下,如果無(wú)法在為套接字指定的超時(shí)內(nèi)完成操作(它們會(huì)引發(fā)timeout異常)或系統(tǒng)返回錯(cuò)誤,則操作將失敗。

注解 在操作系統(tǒng)級(jí)別,超時(shí)模式下的套接字在內(nèi)部設(shè)置為非阻塞模式。同樣,阻塞和超時(shí)模式在引用相同網(wǎng)絡(luò)端點(diǎn)的文件描述符和套接字對(duì)象之間共享。如果例如您決定使用fileno()套接字,則此實(shí)現(xiàn)細(xì)節(jié)可能會(huì)產(chǎn)生明顯的后果。
超時(shí)和connect方法
該connect()操作還受超時(shí)設(shè)置的約束,通常建議在調(diào)用settimeout() 之前先調(diào)用connect()或?qū)⒊瑫r(shí)參數(shù)傳遞給 create_connection()。但是,無(wú)論任何Python套接字超時(shí)設(shè)置如何,系統(tǒng)網(wǎng)絡(luò)堆棧也都可能返回其自身的連接超時(shí)錯(cuò)誤。

超時(shí)和accept方法
如果getdefaulttimeout()不是None,則accept()方法返回的套接字將繼承該超時(shí)。否則,其行為取決于偵聽(tīng)套接字的設(shè)置:

如果偵聽(tīng)套接字處于阻塞模式或超時(shí)模式,則返回的套接字accept()處于阻塞模式 ;

如果偵聽(tīng)套接字處于非阻塞模式,則由返回的套接字accept()處于阻塞還是非阻塞模式取決于操作系統(tǒng)。如果要確??缙脚_(tái)行為,建議您手動(dòng)覆蓋此設(shè)置。

示例
以下是使用TCP / IP協(xié)議的四個(gè)最小示例程序:一臺(tái)服務(wù)器,該服務(wù)器回顯它收到的所有數(shù)據(jù)(僅服務(wù)于一個(gè)客戶端),以及一個(gè)使用它的客戶端。注意,服務(wù)器必須執(zhí)行序列socket(), bind(),listen(),accept()(可能重復(fù)accept(),以服務(wù)一個(gè)以上的客戶端),而一個(gè)客戶端只需要在序列socket(),connect()。另請(qǐng)注意,服務(wù)器不在sendall()/ recv()正在監(jiān)聽(tīng)的套接字上,而是/ 返回的新套接字上 accept()。

前兩個(gè)示例僅支持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))
接下來(lái)的兩個(gè)示例與以上兩個(gè)示例相同,但同時(shí)支持IPv4和IPv6。服務(wù)器端將監(jiān)聽(tīng)第一個(gè)可用的地址族(它應(yīng)該監(jiān)聽(tīng)兩個(gè))。在大多數(shù)支持IPv6的系統(tǒng)上,IPv6優(yōu)先,服務(wù)器可能不接受IPv4流量??蛻舳藢L試連接到由于名稱解析而返回的所有地址,并將流量發(fā)送到成功連接的第一個(gè)地址。

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))
下一個(gè)示例顯示了如何在Windows上使用原始套接字編寫(xiě)一個(gè)非常簡(jiǎn)單的網(wǎng)絡(luò)嗅探器。該示例需要管理員特權(quán)才能修改接口:

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)
下一個(gè)示例說(shuō)明如何使用套接字接口通過(guò)原始套接字協(xié)議與CAN網(wǎng)絡(luò)通信。要將CAN與廣播管理器協(xié)議結(jié)合使用,請(qǐng)打開(kāi)帶有以下內(nèi)容的套接字:

socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
在綁定(CAN_RAW)或連接(CAN_BCM)套接字后,您可以照常使用socket.send(),以及socket.recv()套接字對(duì)象上的操作(及其對(duì)應(yīng)項(xiàng))。

最后一個(gè)示例可能需要特殊特權(quán):

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')

多次運(yùn)行示例,兩次執(zhí)行之間的延遲太短,可能導(dǎo)致此錯(cuò)誤:

OSError: [Errno 98] Address already in use
這是因?yàn)橄惹暗膱?zhí)行使套接字處于一種TIME_WAIT 狀態(tài),無(wú)法立即重用。

socket為了防止這種情況,設(shè)置了一個(gè)標(biāo)志 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標(biāo)志告訴內(nèi)核重用處于TIME_WAIT狀態(tài)的本地套接字 ,而不必等待其自然超時(shí)到期。

參見(jiàn) 有關(guān)套接字編程(用C語(yǔ)言編寫(xiě))的介紹,請(qǐng)參見(jiàn)以下文章:
Stuart Sechrest撰寫(xiě)的4.3BSD進(jìn)程間通信入門(mén)教程

Samuel J. Leffler等人撰寫(xiě)的高級(jí)4.3BSD進(jìn)程間通信教程,

兩者均在UNIX程序員手冊(cè),補(bǔ)充文檔1(第PS1:7和PS1:8節(jié))中進(jìn)行。各種與套接字相關(guān)的系統(tǒng)調(diào)用的特定于平臺(tái)的參考資料也是有關(guān)套接字語(yǔ)義詳細(xì)信息的寶貴信息來(lái)源。對(duì)于Unix,請(qǐng)參考手冊(cè)頁(yè)。對(duì)于Windows,請(qǐng)參閱WinSock(或Winsock 2)規(guī)范。對(duì)于支持IPv6的API,讀者可能需要參考RFC 3493,標(biāo)題為IPv6的基本套接字接口擴(kuò)展。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 網(wǎng)絡(luò)編程 一.楔子 你現(xiàn)在已經(jīng)學(xué)會(huì)了寫(xiě)python代碼,假如你寫(xiě)了兩個(gè)python文件a.py和b.py,分別去運(yùn)...
    go以恒閱讀 2,238評(píng)論 0 6
  • 套接字(Socket) 伯克利套接字(BSD Socket) 套接字(socket)是一個(gè)抽象層,應(yīng)用程序可以通過(guò)...
    夙小葉閱讀 2,094評(píng)論 0 0
  • Socket創(chuàng)建函數(shù) socket.socket(socket_family, socket_type, prot...
    JianMing閱讀 6,091評(píng)論 1 13
  • socket通信原理 socket又被叫做套接字,它就像連接到兩端的插座孔一樣,通過(guò)建立管道,將兩個(gè)不同的進(jìn)程之間...
    jiodg45閱讀 1,227評(píng)論 0 1
  • 快速排序與折半查找 readme 關(guān)于本程序中的EOF說(shuō)明:由于程序包含標(biāo)準(zhǔn)輸入,以EOF結(jié)束循環(huán)。win下EOF...
    crabor閱讀 186評(píng)論 0 0

友情鏈接更多精彩內(nèi)容