日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux unix域socket_python3从零学习-5.8.1、socket—底层网络接口

發(fā)布時(shí)間:2024/7/23 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux unix域socket_python3从零学习-5.8.1、socket—底层网络接口 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

源代碼: Lib/socket.py

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

這個(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)度是隱式的。

常量

AF_* 和 SOCK_* 常量現(xiàn)在都在 AddressFamily 和 SocketKind 這兩個(gè) IntEnum 集合內(nèi)。

socket.AF_UNIX

socket.AF_INET

socket.AF_INET6

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

socket.SOCK_STREAM

socket.SOCK_DGRAM

socket.SOCK_RAW

socket.SOCK_RDM

socket.SOCK_SEQPACKET

這些常量表示套接字類型,用于 socket() 的第二個(gè)參數(shù)。不同系統(tǒng)可能會(huì)有更多其他常量可用。(一般只有 SOCK_STREAM 和 SOCK_DGRAM 可用)

socket.SOCK_CLOEXEC

socket.SOCK_NONBLOCK

這兩個(gè)常量(如果已定義)可以與上述套接字類型結(jié)合使用,并允許你設(shè)置一些原子性的 flags (從而避免可能的競(jìng)爭(zhēng)條件和單獨(dú)調(diào)用的需要)。

SO_*

socket.SOMAXCONN

MSG_*

SOL_*

SCM_*

IPPROTO_*

IPPORT_*

INADDR_*

IP_*

IPV6_*

EAI_*

AI_*

NI_*

TCP_*

此列表內(nèi)的許多常量,記載在 Unix 文檔中的套接字和/或 IP 協(xié)議部分,同時(shí)也定義在本 socket 模塊中。它們通常用于套接字對(duì)象的 setsockopt() 和 getsockopt() 方法的參數(shù)中。在大多數(shù)情況下,僅那些在 Unix 頭文件中有定義的符號(hào)會(huì)在本模塊中定義,部分符號(hào)提供了默認(rèn)值。

在 3.6 版更改: 添加了 SO_DOMAIN、SO_PROTOCOL、SO_PEERSEC、SO_PASSSEC、TCP_USER_TIMEOUT、TCP_CONGESTION。

在 3.6.5 版更改: 在 Windows 上,如果 Windows 運(yùn)行時(shí)支持,則 TCP_FASTOPEN、TCP_KEEPCNT 可用。

socket.AF_CAN

socket.PF_CAN

SOL_CAN_*

CAN_*

此列表內(nèi)的許多常量,記載在 Linux 文檔中,同時(shí)也定義在本 socket 模塊中。

socket.CAN_BCM

CAN_BCM_*

CAN 協(xié)議簇內(nèi)的 CAN_BCM 是廣播管理器(Bbroadcast Manager – BCM)協(xié)議,廣播管理器常量在 Linux 文檔中有所記載,在本 socket 模塊中也有定義。

socket.AF_PACKET

socket.PF_PACKET

PACKET_*

此列表內(nèi)的許多常量,記載在 Linux 文檔中,同時(shí)也定義在本 socket 模塊中。

socket.AF_RDS

socket.PF_RDS

socket.SOL_RDS

RDS_*

此列表內(nèi)的許多常量,記載在 Linux 文檔中,同時(shí)也定義在本 socket 模塊中。

socket.SIO_RCVALL

socket.SIO_KEEPALIVE_VALS

socket.SIO_LOOPBACK_FAST_PATH

RCVALL_*

Windows 的 WSAIoctl() 的常量。這些常量用于套接字對(duì)象的 ioctl() 方法的參數(shù)。

在 3.6 版更改: 添加了 SIO_LOOPBACK_FAST_PATH。

TIPC_*

TIPC 相關(guān)常量,與 C socket API 導(dǎo)出的常量一致。更多信息請(qǐng)參閱 TIPC 文檔。

socket.AF_ALG

socket.SOL_ALG

ALG_*

用于 Linux 內(nèi)核加密算法的常量。

socket.AF_LINK

Availability: BSD, OSX.

socket.has_ipv6

本常量為一個(gè)布爾值,該值指示當(dāng)前平臺(tái)是否支持 IPv6。

socket.BDADDR_ANY

socket.BDADDR_LOCAL

這些是字符串常量,包含藍(lán)牙地址,這些地址具有特殊含義。例如,當(dāng)用 BTPROTO_RFCOMM 指定綁定套接字時(shí), BDADDR_ANY 表示“任何地址”。

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 上不可用。

函數(shù)

創(chuàng)建套接字

下列函數(shù)都能創(chuàng)建 套接字對(duì)象.

  • socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)

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

  • socket.socketpair([family[, type[, proto]]])

構(gòu)建一對(duì)已連接的套接字對(duì)象,使用給定的地址簇、套接字類型和協(xié)議號(hào)。地址簇、套接字類型和協(xié)議號(hào)與上述 socket() 函數(shù)相同。默認(rèn)地址簇為 AF_UNIX (需要當(dāng)前平臺(tái)支持,不支持則默認(rèn)為 AF_INET )。

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

  • socket.create_connection(address[, timeout[, source_address]])

連接到一個(gè) TCP 服務(wù),該服務(wù)正在偵聽 Internet address (用二元組 (host, port) 表示)。連接后返回套接字對(duì)象。這是比 socket.connect() 更高級(jí)的函數(shù):如果 host 是非數(shù)字主機(jī)名,它將嘗試從 AF_INET 和 AF_INET6 解析它,然后依次嘗試連接到所有可能的地址,直到連接成功。這使得編寫兼容 IPv4 和 IPv6 的客戶端變得容易。

傳入可選參數(shù) timeout 可以在套接字實(shí)例上設(shè)置超時(shí)(在嘗試連接前)。如果未提供 timeout,則使用由 getdefaulttimeout() 返回的全局默認(rèn)超時(shí)設(shè)置。

如果提供了 source_address,它必須為二元組 (host, port),以便套接字在連接之前綁定為其源地址。如果 host 或 port 分別為 ‘’ 或 0,則使用操作系統(tǒng)默認(rèn)行為。

  • socket.fromfd(fd, family, type, proto=0)

復(fù)制文件描述符 fd (一個(gè)由文件對(duì)象的 fileno() 方法返回的整數(shù)),然后從結(jié)果中構(gòu)建一個(gè)套接字對(duì)象。地址簇、套接字類型和協(xié)議號(hào)與上述 socket() 函數(shù)相同。文件描述符應(yīng)指向一個(gè)套接字,但不會(huì)專門去檢查——如果文件描述符是無(wú)效的,則對(duì)該對(duì)象的后續(xù)操作可能會(huì)失敗。本函數(shù)很少用到,但是在將套接字作為標(biāo)準(zhǔn)輸入或輸出傳遞給程序(如 Unix inet 守護(hù)程序啟動(dòng)的服務(wù)器)時(shí),可以使用本函數(shù)獲取或設(shè)置套接字選項(xiàng)。套接字須處于阻塞模式。

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

  • socket.fromshare(data)

根據(jù) socket.share() 方法獲得的數(shù)據(jù)實(shí)例化套接字。套接字須處于阻塞模式。

  • socket.SocketType

這是一個(gè) Python 類型對(duì)象,表示套接字對(duì)象的類型。它等同于 type(socket(...))。

其他功能

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

  • socket.getaddrinfo(host, port, family=0, type=0, proto=0, flags=0)

將 host/port 參數(shù)轉(zhuǎn)換為 5 元組的序列,其中包含創(chuàng)建(連接到某服務(wù)的)套接字所需的所有參數(shù)。host 是域名,是字符串格式的 IPv4/v6 地址或 None。port 是字符串格式的服務(wù)名稱,如 'http' 、端口號(hào)(數(shù)字)或 None。傳入 None 作為 host 和 port 的值,相當(dāng)于將 NULL 傳遞給底層 C API。

可以指定 family、type 和 proto 參數(shù),以縮小返回的地址列表。向這些參數(shù)分別傳入 0 表示保留全部結(jié)果范圍。flags 參數(shù)可以是 AI_* 常量中的一個(gè)或多個(gè),它會(huì)影響結(jié)果的計(jì)算和返回。例如,AI_NUMERICHOST 會(huì)禁用域名解析,此時(shí)如果 host 是域名,則會(huì)拋出錯(cuò)誤。

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

(family, type, proto, canonname, sockaddr)

在這些元組中,family、type、proto 都是整數(shù),可以用于傳遞給 socket() 函數(shù)。如果 flags 參數(shù)有一部分是 AI_CANONNAME,那么 canonname 將是表示 host 的規(guī)范名稱的字符串。否則 canonname 將為空。sockaddr 是一個(gè)表示套接字地址的元組,具體格式取決于返回的 family (對(duì)于 AF_INET,是一個(gè) (address, port) 二元組,對(duì)于 AF_INET6,是一個(gè) (address, port, flow info, scope id) 四元組),可以用于傳遞給 socket.connect() 方法。

  • socket.getfqdn([name])

返回 name 的全限定域名 (Fully Qualified Domain Name – FQDN)。如果 name 省略或?yàn)榭?#xff0c;則將其解釋為本地主機(jī)。為了查找全限定名稱,首先將檢查由 gethostbyaddr() 返回的主機(jī)名,然后是主機(jī)的別名(如果存在)。選中第一個(gè)包含句點(diǎn)的名字。如果無(wú)法獲取全限定域名,則返回由 gethostname() 返回的主機(jī)名。

  • socket.gethostbyname(hostname)

將主機(jī)名轉(zhuǎn)換為 IPv4 地址格式。IPv4 地址以字符串格式返回,如 '100.50.200.5'。如果主機(jī)名本身是 IPv4 地址,則原樣返回。更完整的接口請(qǐng)參考 gethostbyname_ex()。gethostbyname() 不支持 IPv6 域名解析,應(yīng)使用 getaddrinfo() 來(lái)支持 IPv4/v6 雙協(xié)議棧。

  • socket.gethostbyname_ex(hostname)

將主機(jī)名轉(zhuǎn)換為 IPv4 地址格式的擴(kuò)展接口。返回三元組 (hostname, aliaslist, ipaddrlist),其中 hostname 是響應(yīng)給定 ip_address 的主要主機(jī)名,aliaslist 是相同地址的其他可用主機(jī)名的列表(可能為空),而 ipaddrlist 是 IPv4 地址列表,包含相同主機(jī)名、相同接口的不同地址(通常是一個(gè)地址,但不總是如此)。gethostbyname_ex() 不支持 IPv6 名稱解析,應(yīng)使用 getaddrinfo() 來(lái)支持 IPv4/v6 雙協(xié)議棧。

  • socket.gethostname()

返回一個(gè)字符串,包含當(dāng)前正在運(yùn)行 Python 解釋器的機(jī)器的主機(jī)名。

注意: gethostname() 并不總是返回全限定域名,必要的話請(qǐng)使用 getfqdn()。

  • socket.gethostbyaddr(ip_address)

返回三元組 (hostname, aliaslist, ipaddrlist),其中 hostname 是響應(yīng)給定 ip_address 的主要主機(jī)名,aliaslist 是相同地址的其他可用主機(jī)名的列表(可能為空),而 ipaddrlist 是 IPv4/v6 地址列表,包含相同主機(jī)名、相同接口的不同地址(很可能僅包含一個(gè)地址)。要查詢?nèi)薅ㄓ蛎?#xff0c;請(qǐng)使用函數(shù) getfqdn()。gethostbyaddr() 支持 IPv4 和 IPv6。

  • socket.getnameinfo(sockaddr, flags)

將套接字地址 sockaddr 轉(zhuǎn)換為二元組 (host, port)。host 的形式可能是全限定域名,或是由數(shù)字表示的地址,具體取決于 flags 的設(shè)置。同樣,port 可以包含字符串格式的端口名稱或數(shù)字格式的端口號(hào)。

  • socket.getprotobyname(protocolname)

將 Internet 協(xié)議名稱(如 'icmp' )轉(zhuǎn)換為常量,該常量適用于 socket() 函數(shù)的第三個(gè)(可選)參數(shù)。通常只有在 “raw” 模式 (SOCK_RAW) 中打開的套接字才需要使用該常量。對(duì)于正常的套接字模式,協(xié)議省略或?yàn)榱銜r(shí),會(huì)自動(dòng)選擇正確的協(xié)議。

  • socket.getservbyname(servicename[, protocolname])

將 Internet 服務(wù)名稱和協(xié)議名稱轉(zhuǎn)換為該服務(wù)的端口號(hào)。協(xié)議名稱是可選的,如果提供的話應(yīng)為 'tcp' 或 'udp',否則將匹配出所有協(xié)議。

  • socket.getservbyport(port[, protocolname])

將 Internet 端口號(hào)和協(xié)議名稱轉(zhuǎn)換為該服務(wù)的服務(wù)名稱。協(xié)議名稱是可選的,如果提供的話應(yīng)為 'tcp' 或 'udp',否則將匹配出所有協(xié)議。

  • socket.ntohl(x)

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

  • socket.ntohs(x)

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

  • socket.htonl(x)

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

  • socket.htons(x)

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

  • socket.inet_aton(ip_string)

將 IPv4 地址從點(diǎn)分十進(jìn)制字符串格式(如 ‘123.45.67.89’ )轉(zhuǎn)換為 32 位壓縮二進(jìn)制格式,轉(zhuǎn)換后為字節(jié)對(duì)象,長(zhǎng)度為四個(gè)字符。與那些使用標(biāo)準(zhǔn) C 庫(kù),且需要 struct in_addr 類型的對(duì)象的程序交換信息時(shí),此功能很有用。 該類型即此函數(shù)返回的 32 位壓縮二進(jìn)制的 C 類型。

inet_aton() 也接受句點(diǎn)數(shù)少于三的字符串,詳情請(qǐng)參閱 Unix 手冊(cè) inet(3)。

如果傳入本函數(shù)的 IPv4 地址字符串無(wú)效,則拋出 OSError。注意,具體什么樣的地址有效取決于 inet_aton() 的底層 C 實(shí)現(xiàn)。

inet_aton() 不支持 IPv6,在 IPv4/v6 雙協(xié)議棧下應(yīng)使用 inet_pton() 來(lái)代替。

  • socket.inet_ntoa(packed_ip)

將 32 位壓縮 IPv4 地址(一個(gè) 類字節(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ù),且需要 struct in_addr 類型的對(duì)象的程序交換信息時(shí),本函數(shù)很有用。 該類型即本函數(shù)參數(shù)中的 32 位壓縮二進(jìn)制數(shù)據(jù)的 C 類型。

如果傳入本函數(shù)的字節(jié)序列長(zhǎng)度不是 4 個(gè)字節(jié),則拋出 OSError。inet_ntoa() 不支持 IPv6,在 IPv4/v6 雙協(xié)議棧下應(yīng)使用 inet_ntop() 來(lái)代替。

  • socket.inet_pton(address_family, ip_string)

將特定地址簇的 IP 地址(字符串)轉(zhuǎn)換為壓縮二進(jìn)制格式。當(dāng)庫(kù)或網(wǎng)絡(luò)協(xié)議需要接受 struct in_addr 類型的對(duì)象(類似 inet_aton() )或 struct in6_addr 類型的對(duì)象時(shí),inet_pton() 很有用。

目前 address_family 支持 AF_INET 和 AF_INET6。如果 IP 地址字符串 ip_string 無(wú)效,則拋出 OSError。注意,具體什么地址有效取決于 address_family 的值和 inet_pton() 的底層實(shí)現(xiàn)。

  • socket.inet_ntop(address_family, packed_ip)

將壓縮 IP 地址(一個(gè) 類字節(jié)對(duì)象,數(shù)個(gè)字節(jié)長(zhǎng))轉(zhuǎn)換為標(biāo)準(zhǔn)的、特定地址簇的字符串形式(如 '7.10.0.5' 或 '5aef:2b::8' )。當(dāng)庫(kù)或網(wǎng)絡(luò)協(xié)議返回 struct in_addr 類型的對(duì)象(類似 inet_ntoa() )或 struct in6_addr 類型的對(duì)象時(shí),inet_ntop() 很有用。

目前 address_family 支持 AF_INET 和 AF_INET6。如果字節(jié)對(duì)象 packed_ip 與指定的地址簇長(zhǎng)度不符,則拋出 ValueError。針對(duì) inet_ntop() 調(diào)用的錯(cuò)誤則拋出 OSError。

  • socket.CMSG_LEN(length)

返回給定 length 所關(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(),以此將尾部填充的空間計(jì)入,即使該項(xiàng)在緩沖區(qū)的最后。如果 length 超出允許范圍,則拋出 OverflowError。

  • socket.CMSG_SPACE(length)

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

請(qǐng)注意,某些系統(tǒng)可能支持輔助數(shù)據(jù),但不提供本函數(shù)。還需注意,如果使用本函數(shù)的結(jié)果來(lái)設(shè)置緩沖區(qū)大小,可能無(wú)法精確限制可接收的輔助數(shù)據(jù)量,因?yàn)榭赡軙?huì)有其他數(shù)據(jù)寫入尾部填充區(qū)域。

  • socket.getdefaulttimeout()

返回用于新套接字對(duì)象的默認(rèn)超時(shí)(以秒為單位的浮點(diǎn)數(shù))。值 None 表示新套接字對(duì)象沒有超時(shí)。首次導(dǎo)入 socket 模塊時(shí),默認(rèn)值為 None。

  • socket.setdefaulttimeout(timeout)

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

  • socket.sethostname(name)

將計(jì)算機(jī)的主機(jī)名設(shè)置為 name。如果權(quán)限不足將拋出 OSError。

  • socket.if_nameindex()

返回一個(gè)列表,包含網(wǎng)絡(luò)接口(網(wǎng)卡)信息二元組(整數(shù)索引,名稱字符串)。系統(tǒng)調(diào)用失敗則拋出 OSError。

  • socket.if_nametoindex(if_name)

返回網(wǎng)絡(luò)接口名稱相對(duì)應(yīng)的索引號(hào)。如果沒有所給名稱的接口,則拋出 OSError。

  • socket.if_indextoname(if_index)

返回網(wǎng)絡(luò)接口索引號(hào)相對(duì)應(yīng)的接口名稱。如果沒有所給索引號(hào)的接口,則拋出 OSError。

套接字對(duì)象

套接字對(duì)象具有以下方法:

  • socket.accept()

接受一個(gè)連接。此 scoket 必須綁定到一個(gè)地址上并且監(jiān)聽連接。返回值是一個(gè) (conn, address) 對(duì),其中 conn 是一個(gè) 新 的套接字對(duì)象,用于在此連接上收發(fā)數(shù)據(jù),address 是連接另一端的套接字所綁定的地址。

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

  • socket.bind(address)

將套接字綁定到 address。套接字必須尚未綁定。

  • socket.close()

將套接字標(biāo)記為關(guān)閉。

當(dāng) makefile() 創(chuàng)建的所有文件對(duì)象都關(guān)閉時(shí),底層系統(tǒng)資源(如文件描述符)也將關(guān)閉。一旦上述情況發(fā)生,將來(lái)對(duì)套接字對(duì)象的所有操作都會(huì)失敗。對(duì)端將接收不到任何數(shù)據(jù)(清空隊(duì)列數(shù)據(jù)后)。

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

在 3.6 版更改: 現(xiàn)在,如果底層的 close() 調(diào)用出錯(cuò),會(huì)拋出 OSError。

注解 close() 釋放與連接相關(guān)聯(lián)的資源,但不一定立即關(guān)閉連接。如果需要及時(shí)關(guān)閉連接,請(qǐng)?jiān)谡{(diào)用 close() 之前調(diào)用 shutdown()。

  • socket.connect(address)

連接到 address 處的遠(yuǎn)程套接字。

如果連接被信號(hào)中斷,則本方法將等待,直到連接完成。如果信號(hào)處理程序未拋出異常,且套接字阻塞中或已超時(shí),則在超時(shí)后拋出 socket.timeout。對(duì)于非阻塞套接字,如果連接被信號(hào)中斷,則本方法將拋出 InterruptedError 異常(或信號(hào)處理程序拋出的異常)。

在 3.5 版更改: 本方法現(xiàn)在將等待,直到連接完成,而不是在以下情況拋出 InterruptedError 異常。該情況為,連接被信號(hào)中斷,信號(hào)處理程序未拋出異常,且套接字阻塞中或已超時(shí)(具體解釋請(qǐng)參閱 PEP 475 )。

  • socket.connect_ex(address)

類似于 connect(address),但是對(duì)于 C 級(jí)別的 connect() 調(diào)用返回的錯(cuò)誤,本函數(shù)將返回錯(cuò)誤指示器,而不是拋出異常(對(duì)于其他問(wèn)題,如“找不到主機(jī)”,仍然可以拋出異常)。如果操作成功,則錯(cuò)誤指示器為 0,否則為 errno 變量的值。這對(duì)支持如異步連接很有用。

  • socket.detach()

將套接字對(duì)象置于關(guān)閉狀態(tài),而底層的文件描述符實(shí)際并不關(guān)閉。返回該文件描述符,使其可以重新用于其他目的。

  • socket.dup()

創(chuàng)建套接字的副本。

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

  • socket.fileno()

返回套接字的文件描述符(一個(gè)小整數(shù)),失敗返回 -1。配合 select.select() 使用很有用。

在 Windows 下,此方法返回的小整數(shù)在允許使用文件描述符的地方無(wú)法使用(如 os.fdopen() )。Unix 無(wú)此限制。

  • socket.get_inheritable()

獲取套接字文件描述符或套接字句柄的 可繼承標(biāo)志 :如果子進(jìn)程可以繼承套接字則為 True,否則為 False。

  • socket.getpeername()

返回套接字連接到的遠(yuǎn)程地址。舉例而言,這可以用于查找遠(yuǎn)程 IPv4/v6 套接字的端口號(hào)。(返回的地址格式取決于地址簇 —— 參見上文。)部分系統(tǒng)不支持此函數(shù)。

  • socket.getsockname()

返回套接字本身的地址。舉例而言,這可以用于查找 IPv4/v6 套接字的端口號(hào)。(返回的地址格式取決于地址簇 —— 參見上文。)

  • socket.getsockopt(level, optname[, buflen])

返回指定套接字選項(xiàng)的值(參閱 Unix 手冊(cè)頁(yè) getsockopt(2) )。所需的符號(hào)常量( SO_* 等)已定義在本模塊中。如果未指定 buflen,則認(rèn)為該選項(xiàng)值為整數(shù),由本函數(shù)返回該整數(shù)值。如果指定 buflen,則它定義了用于存放選項(xiàng)值的緩沖區(qū)的最大長(zhǎng)度,且該緩沖區(qū)將作為字節(jié)對(duì)象返回。對(duì)緩沖區(qū)的解碼工作由調(diào)用者自行完成(針對(duì)編碼為字節(jié)串的 C 結(jié)構(gòu),其解碼方法請(qǐng)參閱可選的內(nèi)置模塊 struct )。

  • socket.gettimeout()

返回套接字操作相關(guān)的超時(shí)秒數(shù)(浮點(diǎn)數(shù)),未設(shè)置超時(shí)則返回 None。它反映最后一次調(diào)用 setblocking() 或 settimeout() 后的設(shè)置。

  • socket.ioctl(control, option)

平臺(tái)

Windows

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

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

當(dāng)前僅支持以下控制碼: SIO_RCVALL、SIO_KEEPALIVE_VALS 和 SIO_LOOPBACK_FAST_PATH。

在 3.6 版更改: 添加了 SIO_LOOPBACK_FAST_PATH。

  • socket.listen([backlog])

啟動(dòng)一個(gè)服務(wù)器用于接受連接。如果指定 backlog,則它最低為 0(小于 0 會(huì)被置為 0),它指定系統(tǒng)允許暫未 accept 的連接數(shù),超過(guò)后將拒絕新連接。未指定則自動(dòng)設(shè)為合理的默認(rèn)值。

在 3.5 版更改: backlog 參數(shù)現(xiàn)在是可選的。

  • socket.recvfrom(bufsize[, flags])

從套接字接收數(shù)據(jù)。返回值是一對(duì) (bytes, address),其中 bytes 是字節(jié)對(duì)象,表示接收到的數(shù)據(jù),address 是發(fā)送端套接字的地址。可選參數(shù) flags 的含義請(qǐng)參閱 Unix 手冊(cè)頁(yè) recv(2),它默認(rèn)為零。

  • socket.recvmsg(bufsize[, ancbufsize[, flags]])

從套接字接收普通數(shù)據(jù)(至多 bufsize 字節(jié))和輔助數(shù)據(jù)。ancbufsize 參數(shù)設(shè)置用于接收輔助數(shù)據(jù)的內(nèi)部緩沖區(qū)的大小(以字節(jié)為單位),默認(rèn)為 0,表示不接收輔助數(shù)據(jù)。可以使用 CMSG_SPACE() 或 CMSG_LEN() 計(jì)算輔助數(shù)據(jù)緩沖區(qū)的合適大小,無(wú)法放入緩沖區(qū)的項(xiàng)目可能會(huì)被截?cái)嗷騺G棄。flags 參數(shù)默認(rèn)為 0,其含義與 recv() 中的相同。

返回值是一個(gè)四元組: (data, ancdata, msg_flags, address)。data 項(xiàng)是一個(gè) bytes 對(duì)象,用于保存接收到的非輔助數(shù)據(jù)。ancdata 項(xiàng)是零個(gè)或多個(gè)元組 (cmsg_level, cmsg_type, cmsg_data) 組成的列表,表示接收到的輔助數(shù)據(jù)(控制消息):cmsg_level 和 cmsg_type 是分別表示協(xié)議級(jí)別和協(xié)議類型的整數(shù),而 cmsg_data 是保存相關(guān)數(shù)據(jù)的 bytes 對(duì)象。msg_flags 項(xiàng)由各種標(biāo)志按位或組成,表示接收消息的情況,詳細(xì)信息請(qǐng)參閱系統(tǒng)文檔。如果接收端套接字?jǐn)嚅_連接,則 address 是發(fā)送端套接字的地址(如果有),否則該值無(wú)指定。

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

  • socket.recvmsg_into(buffers[, ancbufsize[, flags]])

從套接字接收普通數(shù)據(jù)和輔助數(shù)據(jù),其行為與 recvmsg() 相同,但將非輔助數(shù)據(jù)分散到一系列緩沖區(qū)中,而不是返回新的字節(jié)對(duì)象。buffers 參數(shù)必須是可迭代對(duì)象,它迭代出可供寫入的緩沖區(qū)(如 bytearray 對(duì)象),這些緩沖區(qū)將被連續(xù)的非輔助數(shù)據(jù)塊填充,直到數(shù)據(jù)全部寫完或緩沖區(qū)用完為止。在允許使用的緩沖區(qū)數(shù)量上,操作系統(tǒng)可能會(huì)有限制( sysconf() 的 SC_IOV_MAX 值)。ancbufsize 和 flags 參數(shù)的含義與 recvmsg() 中的相同。

  • socket.recvfrom_into(buffer[, nbytes[, flags]])

從套接字接收數(shù)據(jù),將其寫入 buffer 而不是創(chuàng)建新的字節(jié)串。返回值是一對(duì) (nbytes, address),其中 nbytes 是收到的字節(jié)數(shù),address 是發(fā)送端套接字的地址。可選參數(shù) flags 的含義請(qǐng)參閱 Unix 手冊(cè)頁(yè) recv(2),它默認(rèn)為零。( address 的格式取決于地址簇 —— 參見上文)

  • socket.recv_into(buffer[, nbytes[, flags]])

從套接字接收至多 nbytes 個(gè)字節(jié),將其寫入緩沖區(qū)而不是創(chuàng)建新的字節(jié)串。如果 nbytes 未指定(或指定為 0),則接收至所給緩沖區(qū)的最大可用大小。返回接收到的字節(jié)數(shù)。可選參數(shù) flags 的含義請(qǐng)參閱 Unix 手冊(cè)頁(yè) recv(2),它默認(rèn)為零。

  • socket.send(bytes[, flags])

發(fā)送數(shù)據(jù)給套接字。本套接字必須已連接到遠(yuǎn)程套接字。可選參數(shù) flags 的含義與上述 recv() 中的相同。本方法返回已發(fā)送的字節(jié)數(shù)。應(yīng)用程序要負(fù)責(zé)檢查所有數(shù)據(jù)是否已發(fā)送,如果僅傳輸了部分?jǐn)?shù)據(jù),程序需要自行嘗試傳輸其余數(shù)據(jù)。有關(guān)該主題的更多信息,請(qǐng)參考 套接字編程指南。

在 3.5 版更改: 如果系統(tǒng)調(diào)用被中斷,但信號(hào)處理程序沒有觸發(fā)異常,此方法現(xiàn)在會(huì)重試系統(tǒng)調(diào)用,而不是觸發(fā) InterruptedError 異常 (原因詳見 PEP 475)。

  • socket.sendall(bytes[, flags])

發(fā)送數(shù)據(jù)給套接字。本套接字必須已連接到遠(yuǎn)程套接字。可選參數(shù) flags 的含義與上述 recv() 中的相同。與 send() 不同,本方法持續(xù)從 bytes 發(fā)送數(shù)據(jù),直到所有數(shù)據(jù)都已發(fā)送或發(fā)生錯(cuò)誤為止。成功后會(huì)返回 None。出錯(cuò)后會(huì)拋出一個(gè)異常,此時(shí)并沒有辦法確定成功發(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)處理程序沒有觸發(fā)異常,此方法現(xiàn)在會(huì)重試系統(tǒng)調(diào)用,而不是觸發(fā) InterruptedError 異常 (原因詳見 PEP 475)。

  • socket.sendto(bytes, address)
  • socket.sendto(bytes, flags, address)

發(fā)送數(shù)據(jù)給套接字。本套接字不應(yīng)連接到遠(yuǎn)程套接字,而應(yīng)由 address 指定目標(biāo)套接字。可選參數(shù) flags 的含義與上述 recv() 中的相同。本方法返回已發(fā)送的字節(jié)數(shù)。( address 的格式取決于地址簇 —— 參見上文。)

在 3.5 版更改: 如果系統(tǒng)調(diào)用被中斷,但信號(hào)處理程序沒有觸發(fā)異常,此方法現(xiàn)在會(huì)重試系統(tǒng)調(diào)用,而不是觸發(fā) InterruptedError 異常 (原因詳見 PEP 475)。

  • socket.sendmsg(buffers[, ancdata[, flags[, address]]])

將普通數(shù)據(jù)和輔助數(shù)據(jù)發(fā)送給套接字,將從一系列緩沖區(qū)中收集非輔助數(shù)據(jù),并將其拼接為一條消息。buffers 參數(shù)指定的非輔助數(shù)據(jù)應(yīng)為可迭代的 字節(jié)類對(duì)象 (如 bytes 對(duì)象),在允許使用的緩沖區(qū)數(shù)量上,操作系統(tǒng)可能會(huì)有限制( sysconf() 的 SC_IOV_MAX 值)。ancdata 參數(shù)指定的輔助數(shù)據(jù)(控制消息)應(yīng)為可迭代對(duì)象,迭代出零個(gè)或多個(gè) (cmsg_level, cmsg_type, cmsg_data) 元組,其中 cmsg_level 和 cmsg_type 是分別指定協(xié)議級(jí)別和協(xié)議類型的整數(shù),而 cmsg_data 是保存相關(guān)數(shù)據(jù)的字節(jié)類對(duì)象。請(qǐng)注意,某些系統(tǒng)(特別是沒有 CMSG_SPACE() 的系統(tǒng))可能每次調(diào)用僅支持發(fā)送一條控制消息。flags 參數(shù)默認(rèn)為 0,與 send() 中的含義相同。如果 address 指定為除 None 以外的值,它將作為消息的目標(biāo)地址。返回值是已發(fā)送的非輔助數(shù)據(jù)的字節(jié)數(shù)。

  • socket.sendmsg_afalg([msg, ]*, op[, iv[, assoclen[, flags]]])

為 AF_ALG 套接字定制的 sendmsg() 版本。可為 AF_ALG 套接字設(shè)置模式、IV、AEAD 關(guān)聯(lián)數(shù)據(jù)的長(zhǎng)度和標(biāo)志位。

  • socket.sendfile(file, offset=0, count=None)

使用高性能的 os.sendfile 發(fā)送文件,直到達(dá)到文件的 EOF 為止,返回已發(fā)送的字節(jié)總數(shù)。file 必須是一個(gè)以二進(jìn)制模式打開的常規(guī)文件對(duì)象。如果 os.sendfile 不可用(如 Windows)或 file 不是常規(guī)文件,將使用 send() 代替。offset 指示從哪里開始讀取文件。如果指定了 count,它確定了要發(fā)送的字節(jié)總數(shù),而不會(huì)持續(xù)發(fā)送直到達(dá)到文件的 EOF。返回時(shí)或發(fā)生錯(cuò)誤時(shí),文件位置將更新,在這種情況下,file.tell() 可用于確定已發(fā)送的字節(jié)數(shù)。套接字必須為 SOCK_STREAM 類型。不支持非阻塞的套接字。

  • socket.set_inheritable(inheritable)

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

  • socket.setblocking(flag)

設(shè)置套接字為阻塞或非阻塞模式:如果 flag 為 false,則將套接字設(shè)置為非阻塞,否則設(shè)置為阻塞。

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

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

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

  • socket.settimeout(value)

為阻塞套接字的操作設(shè)置超時(shí)。value 參數(shù)可以是非負(fù)浮點(diǎn)數(shù),表示秒,也可以是 None。如果賦為一個(gè)非零值,那么如果在操作完成前超過(guò)了超時(shí)時(shí)間 value,后續(xù)的套接字操作將拋出 timeout 異常。如果賦為 0,則套接字將處于非阻塞模式。如果指定為 None,則套接字將處于阻塞模式。

  • socket.shutdown(how)

關(guān)閉一半或全部的連接。如果 how 為 SHUT_RD,則后續(xù)不再允許接收。如果 how 為 SHUT_WR,則后續(xù)不再允許發(fā)送。如果 how 為 SHUT_RDWR,則后續(xù)的發(fā)送和接收都不允許。

  • socket.share(process_id)

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

關(guān)于套接字超時(shí)的說(shuō)明

一個(gè)套接字對(duì)象可以處于以下三種模式之一:阻塞、非阻塞或超時(shí)。套接字默認(rèn)以阻塞模式創(chuàng)建,但是可以調(diào)用 setdefaulttimeout() 來(lái)更改。

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

在 non-blocking mode (非阻塞模式)中,如果操作無(wú)法立即完成,則操作將失敗(不幸的是,不同系統(tǒng)返回的錯(cuò)誤不同):位于 select 中的函數(shù)可用于了解套接字何時(shí)以及是否可以讀取或?qū)懭搿?/p>

在 timeout mode (超時(shí)模式)下,如果無(wú)法在指定的超時(shí)內(nèi)完成操作(拋出 timeout 異常),或如果系統(tǒng)返回錯(cuò)誤,則操作將失敗。

  • 超時(shí)與 connect 方法

connect() 操作也受超時(shí)設(shè)置的約束,通常建議在調(diào)用 connect() 之前調(diào)用 settimeout(),或?qū)⒊瑫r(shí)參數(shù)直接傳遞給 create_connection()。但是,無(wú)論 Python 套接字超時(shí)設(shè)置如何,系統(tǒng)網(wǎng)絡(luò)棧都有可能返回自帶的連接超時(shí)錯(cuò)誤。

  • 超時(shí)與 accept 方法

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

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

如果偵聽套接字處于 非阻塞模式,那么 accept() 返回的套接字是阻塞還是非阻塞取決于操作系統(tǒng)。如果要確保跨平臺(tái)時(shí)的正確行為,建議手動(dòng)覆蓋此設(shè)置。

總結(jié)

以上是生活随笔為你收集整理的linux unix域socket_python3从零学习-5.8.1、socket—底层网络接口的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。