向一个无法连接的网络尝试了一个套接字操作_python3从零学习-5.8.1、socket—底层网络接口...
源代碼: Lib/socket.py
這個模塊提供了訪問BSD*套接字*的接口。在所有現代Unix系統、Windows、macOS和其他一些平臺上可用。
這個Python接口是用Python的面向對象風格對Unix系統調用和套接字庫接口的直譯:函數 socket() 返回一個 套接字對象 ,其方法是對各種套接字系統調用的實現。形參類型一般與C接口相比更高級:例如在Python文件 read() 和 write() 操作中,接收操作的緩沖區分配是自動的,發送操作的緩沖區長度是隱式的。
常量
AF_* 和 SOCK_* 常量現在都在 AddressFamily 和 SocketKind 這兩個 IntEnum 集合內。
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
這兩個常量(如果已定義)可以與上述套接字類型結合使用,并允許你設置一些原子性的 flags (從而避免可能的競爭條件和單獨調用的需要)。
SO_*
socket.SOMAXCONN
MSG_*
SOL_*
SCM_*
IPPROTO_*
IPPORT_*
INADDR_*
IP_*
IPV6_*
EAI_*
AI_*
NI_*
TCP_*
此列表內的許多常量,記載在 Unix 文檔中的套接字和/或 IP 協議部分,同時也定義在本 socket 模塊中。它們通常用于套接字對象的 setsockopt() 和 getsockopt() 方法的參數中。在大多數情況下,僅那些在 Unix 頭文件中有定義的符號會在本模塊中定義,部分符號提供了默認值。
在 3.6 版更改: 添加了 SO_DOMAIN、SO_PROTOCOL、SO_PEERSEC、SO_PASSSEC、TCP_USER_TIMEOUT、TCP_CONGESTION。
在 3.6.5 版更改: 在 Windows 上,如果 Windows 運行時支持,則 TCP_FASTOPEN、TCP_KEEPCNT 可用。
socket.AF_CAN
socket.PF_CAN
SOL_CAN_*
CAN_*
此列表內的許多常量,記載在 Linux 文檔中,同時也定義在本 socket 模塊中。
socket.CAN_BCM
CAN_BCM_*
CAN 協議簇內的 CAN_BCM 是廣播管理器(Bbroadcast Manager – BCM)協議,廣播管理器常量在 Linux 文檔中有所記載,在本 socket 模塊中也有定義。
socket.AF_PACKET
socket.PF_PACKET
PACKET_*
此列表內的許多常量,記載在 Linux 文檔中,同時也定義在本 socket 模塊中。
socket.AF_RDS
socket.PF_RDS
socket.SOL_RDS
RDS_*
此列表內的許多常量,記載在 Linux 文檔中,同時也定義在本 socket 模塊中。
socket.SIO_RCVALL
socket.SIO_KEEPALIVE_VALS
socket.SIO_LOOPBACK_FAST_PATH
RCVALL_*
Windows 的 WSAIoctl() 的常量。這些常量用于套接字對象的 ioctl() 方法的參數。
在 3.6 版更改: 添加了 SIO_LOOPBACK_FAST_PATH。
TIPC_*
TIPC 相關常量,與 C socket API 導出的常量一致。更多信息請參閱 TIPC 文檔。
socket.AF_ALG
socket.SOL_ALG
ALG_*
用于 Linux 內核加密算法的常量。
socket.AF_LINK
Availability: BSD, OSX.
socket.has_ipv6
本常量為一個布爾值,該值指示當前平臺是否支持 IPv6。
socket.BDADDR_ANY
socket.BDADDR_LOCAL
這些是字符串常量,包含藍牙地址,這些地址具有特殊含義。例如,當用 BTPROTO_RFCOMM 指定綁定套接字時, 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 上不可用。
函數
創建套接字
下列函數都能創建 套接字對象.
- socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
新創建的套接字是 不可繼承的。
- socket.socketpair([family[, type[, proto]]])
構建一對已連接的套接字對象,使用給定的地址簇、套接字類型和協議號。地址簇、套接字類型和協議號與上述 socket() 函數相同。默認地址簇為 AF_UNIX (需要當前平臺支持,不支持則默認為 AF_INET )。
新創建的套接字都是 不可繼承的。
- socket.create_connection(address[, timeout[, source_address]])
連接到一個 TCP 服務,該服務正在偵聽 Internet address (用二元組 (host, port) 表示)。連接后返回套接字對象。這是比 socket.connect() 更高級的函數:如果 host 是非數字主機名,它將嘗試從 AF_INET 和 AF_INET6 解析它,然后依次嘗試連接到所有可能的地址,直到連接成功。這使得編寫兼容 IPv4 和 IPv6 的客戶端變得容易。
傳入可選參數 timeout 可以在套接字實例上設置超時(在嘗試連接前)。如果未提供 timeout,則使用由 getdefaulttimeout() 返回的全局默認超時設置。
如果提供了 source_address,它必須為二元組 (host, port),以便套接字在連接之前綁定為其源地址。如果 host 或 port 分別為 ‘’ 或 0,則使用操作系統默認行為。
- socket.fromfd(fd, family, type, proto=0)
復制文件描述符 fd (一個由文件對象的 fileno() 方法返回的整數),然后從結果中構建一個套接字對象。地址簇、套接字類型和協議號與上述 socket() 函數相同。文件描述符應指向一個套接字,但不會專門去檢查——如果文件描述符是無效的,則對該對象的后續操作可能會失敗。本函數很少用到,但是在將套接字作為標準輸入或輸出傳遞給程序(如 Unix inet 守護程序啟動的服務器)時,可以使用本函數獲取或設置套接字選項。套接字須處于阻塞模式。
新創建的套接字是 不可繼承的。
- socket.fromshare(data)
根據 socket.share() 方法獲得的數據實例化套接字。套接字須處于阻塞模式。
- socket.SocketType
這是一個 Python 類型對象,表示套接字對象的類型。它等同于 type(socket(...))。
其他功能
socket 模塊還提供各種與網絡相關的服務:
- socket.getaddrinfo(host, port, family=0, type=0, proto=0, flags=0)
將 host/port 參數轉換為 5 元組的序列,其中包含創建(連接到某服務的)套接字所需的所有參數。host 是域名,是字符串格式的 IPv4/v6 地址或 None。port 是字符串格式的服務名稱,如 'http' 、端口號(數字)或 None。傳入 None 作為 host 和 port 的值,相當于將 NULL 傳遞給底層 C API。
可以指定 family、type 和 proto 參數,以縮小返回的地址列表。向這些參數分別傳入 0 表示保留全部結果范圍。flags 參數可以是 AI_* 常量中的一個或多個,它會影響結果的計算和返回。例如,AI_NUMERICHOST 會禁用域名解析,此時如果 host 是域名,則會拋出錯誤。
本函數返回的 5 元組列表具有以下結構:
(family, type, proto, canonname, sockaddr)
在這些元組中,family、type、proto 都是整數,可以用于傳遞給 socket() 函數。如果 flags 參數有一部分是 AI_CANONNAME,那么 canonname 將是表示 host 的規范名稱的字符串。否則 canonname 將為空。sockaddr 是一個表示套接字地址的元組,具體格式取決于返回的 family (對于 AF_INET,是一個 (address, port) 二元組,對于 AF_INET6,是一個 (address, port, flow info, scope id) 四元組),可以用于傳遞給 socket.connect() 方法。
- socket.getfqdn([name])
返回 name 的全限定域名 (Fully Qualified Domain Name – FQDN)。如果 name 省略或為空,則將其解釋為本地主機。為了查找全限定名稱,首先將檢查由 gethostbyaddr() 返回的主機名,然后是主機的別名(如果存在)。選中第一個包含句點的名字。如果無法獲取全限定域名,則返回由 gethostname() 返回的主機名。
- socket.gethostbyname(hostname)
將主機名轉換為 IPv4 地址格式。IPv4 地址以字符串格式返回,如 '100.50.200.5'。如果主機名本身是 IPv4 地址,則原樣返回。更完整的接口請參考 gethostbyname_ex()。gethostbyname() 不支持 IPv6 域名解析,應使用 getaddrinfo() 來支持 IPv4/v6 雙協議棧。
- socket.gethostbyname_ex(hostname)
將主機名轉換為 IPv4 地址格式的擴展接口。返回三元組 (hostname, aliaslist, ipaddrlist),其中 hostname 是響應給定 ip_address 的主要主機名,aliaslist 是相同地址的其他可用主機名的列表(可能為空),而 ipaddrlist 是 IPv4 地址列表,包含相同主機名、相同接口的不同地址(通常是一個地址,但不總是如此)。gethostbyname_ex() 不支持 IPv6 名稱解析,應使用 getaddrinfo() 來支持 IPv4/v6 雙協議棧。
- socket.gethostname()
返回一個字符串,包含當前正在運行 Python 解釋器的機器的主機名。
注意: gethostname() 并不總是返回全限定域名,必要的話請使用 getfqdn()。
- socket.gethostbyaddr(ip_address)
返回三元組 (hostname, aliaslist, ipaddrlist),其中 hostname 是響應給定 ip_address 的主要主機名,aliaslist 是相同地址的其他可用主機名的列表(可能為空),而 ipaddrlist 是 IPv4/v6 地址列表,包含相同主機名、相同接口的不同地址(很可能僅包含一個地址)。要查詢全限定域名,請使用函數 getfqdn()。gethostbyaddr() 支持 IPv4 和 IPv6。
- socket.getnameinfo(sockaddr, flags)
將套接字地址 sockaddr 轉換為二元組 (host, port)。host 的形式可能是全限定域名,或是由數字表示的地址,具體取決于 flags 的設置。同樣,port 可以包含字符串格式的端口名稱或數字格式的端口號。
- socket.getprotobyname(protocolname)
將 Internet 協議名稱(如 'icmp' )轉換為常量,該常量適用于 socket() 函數的第三個(可選)參數。通常只有在 “raw” 模式 (SOCK_RAW) 中打開的套接字才需要使用該常量。對于正常的套接字模式,協議省略或為零時,會自動選擇正確的協議。
- socket.getservbyname(servicename[, protocolname])
將 Internet 服務名稱和協議名稱轉換為該服務的端口號。協議名稱是可選的,如果提供的話應為 'tcp' 或 'udp',否則將匹配出所有協議。
- socket.getservbyport(port[, protocolname])
將 Internet 端口號和協議名稱轉換為該服務的服務名稱。協議名稱是可選的,如果提供的話應為 'tcp' 或 'udp',否則將匹配出所有協議。
- socket.ntohl(x)
將 32 位正整數從網絡字節序轉換為主機字節序。在主機字節序與網絡字節序相同的計算機上,這是一個空操作。字節序不同將執行 4 字節交換操作。
- socket.ntohs(x)
將 16 位正整數從網絡字節序轉換為主機字節序。在主機字節序與網絡字節序相同的計算機上,這是一個空操作。字節序不同將執行 2 字節交換操作。
- socket.htonl(x)
將 32 位正整數從主機字節序轉換為網絡字節序。在主機字節序與網絡字節序相同的計算機上,這是一個空操作。字節序不同將執行 4 字節交換操作。
- socket.htons(x)
將 16 位正整數從主機字節序轉換為網絡字節序。在主機字節序與網絡字節序相同的計算機上,這是一個空操作。字節序不同將執行 2 字節交換操作。
- socket.inet_aton(ip_string)
將 IPv4 地址從點分十進制字符串格式(如 ‘123.45.67.89’ )轉換為 32 位壓縮二進制格式,轉換后為字節對象,長度為四個字符。與那些使用標準 C 庫,且需要 struct in_addr 類型的對象的程序交換信息時,此功能很有用。 該類型即此函數返回的 32 位壓縮二進制的 C 類型。
inet_aton() 也接受句點數少于三的字符串,詳情請參閱 Unix 手冊 inet(3)。
如果傳入本函數的 IPv4 地址字符串無效,則拋出 OSError。注意,具體什么樣的地址有效取決于 inet_aton() 的底層 C 實現。
inet_aton() 不支持 IPv6,在 IPv4/v6 雙協議棧下應使用 inet_pton() 來代替。
- socket.inet_ntoa(packed_ip)
將 32 位壓縮 IPv4 地址(一個 類字節對象,長 4 個字節)轉換為標準的點分十進制字符串形式(如 ‘123.45.67.89’ )。與那些使用標準 C 庫,且需要 struct in_addr 類型的對象的程序交換信息時,本函數很有用。 該類型即本函數參數中的 32 位壓縮二進制數據的 C 類型。
如果傳入本函數的字節序列長度不是 4 個字節,則拋出 OSError。inet_ntoa() 不支持 IPv6,在 IPv4/v6 雙協議棧下應使用 inet_ntop() 來代替。
- socket.inet_pton(address_family, ip_string)
將特定地址簇的 IP 地址(字符串)轉換為壓縮二進制格式。當庫或網絡協議需要接受 struct in_addr 類型的對象(類似 inet_aton() )或 struct in6_addr 類型的對象時,inet_pton() 很有用。
目前 address_family 支持 AF_INET 和 AF_INET6。如果 IP 地址字符串 ip_string 無效,則拋出 OSError。注意,具體什么地址有效取決于 address_family 的值和 inet_pton() 的底層實現。
- socket.inet_ntop(address_family, packed_ip)
將壓縮 IP 地址(一個 類字節對象,數個字節長)轉換為標準的、特定地址簇的字符串形式(如 '7.10.0.5' 或 '5aef:2b::8' )。當庫或網絡協議返回 struct in_addr 類型的對象(類似 inet_ntoa() )或 struct in6_addr 類型的對象時,inet_ntop() 很有用。
目前 address_family 支持 AF_INET 和 AF_INET6。如果字節對象 packed_ip 與指定的地址簇長度不符,則拋出 ValueError。針對 inet_ntop() 調用的錯誤則拋出 OSError。
- socket.CMSG_LEN(length)
返回給定 length 所關聯數據的輔助數據項的總長度(不帶尾部填充)。此值通常用作 recvmsg() 接收一個輔助數據項的緩沖區大小,但是 RFC 3542 要求可移植應用程序使用 CMSG_SPACE(),以此將尾部填充的空間計入,即使該項在緩沖區的最后。如果 length 超出允許范圍,則拋出 OverflowError。
- socket.CMSG_SPACE(length)
返回 recvmsg() 所需的緩沖區大小,以接收給定 length 所關聯數據的輔助數據項,帶有尾部填充。接收多個項目所需的緩沖區空間是關聯數據長度的 CMSG_SPACE() 值的總和。如果 length 超出允許范圍,則拋出 OverflowError。
請注意,某些系統可能支持輔助數據,但不提供本函數。還需注意,如果使用本函數的結果來設置緩沖區大小,可能無法精確限制可接收的輔助數據量,因為可能會有其他數據寫入尾部填充區域。
- socket.getdefaulttimeout()
返回用于新套接字對象的默認超時(以秒為單位的浮點數)。值 None 表示新套接字對象沒有超時。首次導入 socket 模塊時,默認值為 None。
- socket.setdefaulttimeout(timeout)
設置用于新套接字對象的默認超時(以秒為單位的浮點數)。首次導入 socket 模塊時,默認值為 None。可能的取值及其各自的含義請參閱 settimeout()。
- socket.sethostname(name)
將計算機的主機名設置為 name。如果權限不足將拋出 OSError。
- socket.if_nameindex()
返回一個列表,包含網絡接口(網卡)信息二元組(整數索引,名稱字符串)。系統調用失敗則拋出 OSError。
- socket.if_nametoindex(if_name)
返回網絡接口名稱相對應的索引號。如果沒有所給名稱的接口,則拋出 OSError。
- socket.if_indextoname(if_index)
返回網絡接口索引號相對應的接口名稱。如果沒有所給索引號的接口,則拋出 OSError。
套接字對象
套接字對象具有以下方法:
- socket.accept()
接受一個連接。此 scoket 必須綁定到一個地址上并且監聽連接。返回值是一個 (conn, address) 對,其中 conn 是一個 新 的套接字對象,用于在此連接上收發數據,address 是連接另一端的套接字所綁定的地址。
新創建的套接字是 不可繼承的。
- socket.bind(address)
將套接字綁定到 address。套接字必須尚未綁定。
- socket.close()
將套接字標記為關閉。
當 makefile() 創建的所有文件對象都關閉時,底層系統資源(如文件描述符)也將關閉。一旦上述情況發生,將來對套接字對象的所有操作都會失敗。對端將接收不到任何數據(清空隊列數據后)。
垃圾回收時,套接字會自動關閉,但建議顯式 close() 它們,或在它們周圍使用 with 語句。
在 3.6 版更改: 現在,如果底層的 close() 調用出錯,會拋出 OSError。
注解 close() 釋放與連接相關聯的資源,但不一定立即關閉連接。如果需要及時關閉連接,請在調用 close() 之前調用 shutdown()。
- socket.connect(address)
連接到 address 處的遠程套接字。
如果連接被信號中斷,則本方法將等待,直到連接完成。如果信號處理程序未拋出異常,且套接字阻塞中或已超時,則在超時后拋出 socket.timeout。對于非阻塞套接字,如果連接被信號中斷,則本方法將拋出 InterruptedError 異常(或信號處理程序拋出的異常)。
在 3.5 版更改: 本方法現在將等待,直到連接完成,而不是在以下情況拋出 InterruptedError 異常。該情況為,連接被信號中斷,信號處理程序未拋出異常,且套接字阻塞中或已超時(具體解釋請參閱 PEP 475 )。
- socket.connect_ex(address)
類似于 connect(address),但是對于 C 級別的 connect() 調用返回的錯誤,本函數將返回錯誤指示器,而不是拋出異常(對于其他問題,如“找不到主機”,仍然可以拋出異常)。如果操作成功,則錯誤指示器為 0,否則為 errno 變量的值。這對支持如異步連接很有用。
- socket.detach()
將套接字對象置于關閉狀態,而底層的文件描述符實際并不關閉。返回該文件描述符,使其可以重新用于其他目的。
- socket.dup()
創建套接字的副本。
新創建的套接字是 不可繼承的。
- socket.fileno()
返回套接字的文件描述符(一個小整數),失敗返回 -1。配合 select.select() 使用很有用。
在 Windows 下,此方法返回的小整數在允許使用文件描述符的地方無法使用(如 os.fdopen() )。Unix 無此限制。
- socket.get_inheritable()
獲取套接字文件描述符或套接字句柄的 可繼承標志 :如果子進程可以繼承套接字則為 True,否則為 False。
- socket.getpeername()
返回套接字連接到的遠程地址。舉例而言,這可以用于查找遠程 IPv4/v6 套接字的端口號。(返回的地址格式取決于地址簇 —— 參見上文。)部分系統不支持此函數。
- socket.getsockname()
返回套接字本身的地址。舉例而言,這可以用于查找 IPv4/v6 套接字的端口號。(返回的地址格式取決于地址簇 —— 參見上文。)
- socket.getsockopt(level, optname[, buflen])
返回指定套接字選項的值(參閱 Unix 手冊頁 getsockopt(2) )。所需的符號常量( SO_* 等)已定義在本模塊中。如果未指定 buflen,則認為該選項值為整數,由本函數返回該整數值。如果指定 buflen,則它定義了用于存放選項值的緩沖區的最大長度,且該緩沖區將作為字節對象返回。對緩沖區的解碼工作由調用者自行完成(針對編碼為字節串的 C 結構,其解碼方法請參閱可選的內置模塊 struct )。
- socket.gettimeout()
返回套接字操作相關的超時秒數(浮點數),未設置超時則返回 None。它反映最后一次調用 setblocking() 或 settimeout() 后的設置。
- socket.ioctl(control, option)
平臺
Windows
ioctl() 方法是 WSAIoctl 系統接口的有限接口。請參考 Win32 文檔 以獲取更多信息。
在其他平臺上,可以使用通用的 fcntl.fcntl() 和 fcntl.ioctl() 函數,它們接受套接字對象作為第一個參數。
當前僅支持以下控制碼: SIO_RCVALL、SIO_KEEPALIVE_VALS 和 SIO_LOOPBACK_FAST_PATH。
在 3.6 版更改: 添加了 SIO_LOOPBACK_FAST_PATH。
- socket.listen([backlog])
啟動一個服務器用于接受連接。如果指定 backlog,則它最低為 0(小于 0 會被置為 0),它指定系統允許暫未 accept 的連接數,超過后將拒絕新連接。未指定則自動設為合理的默認值。
在 3.5 版更改: backlog 參數現在是可選的。
- socket.recvfrom(bufsize[, flags])
從套接字接收數據。返回值是一對 (bytes, address),其中 bytes 是字節對象,表示接收到的數據,address 是發送端套接字的地址。可選參數 flags 的含義請參閱 Unix 手冊頁 recv(2),它默認為零。
- socket.recvmsg(bufsize[, ancbufsize[, flags]])
從套接字接收普通數據(至多 bufsize 字節)和輔助數據。ancbufsize 參數設置用于接收輔助數據的內部緩沖區的大小(以字節為單位),默認為 0,表示不接收輔助數據。可以使用 CMSG_SPACE() 或 CMSG_LEN() 計算輔助數據緩沖區的合適大小,無法放入緩沖區的項目可能會被截斷或丟棄。flags 參數默認為 0,其含義與 recv() 中的相同。
返回值是一個四元組: (data, ancdata, msg_flags, address)。data 項是一個 bytes 對象,用于保存接收到的非輔助數據。ancdata 項是零個或多個元組 (cmsg_level, cmsg_type, cmsg_data) 組成的列表,表示接收到的輔助數據(控制消息):cmsg_level 和 cmsg_type 是分別表示協議級別和協議類型的整數,而 cmsg_data 是保存相關數據的 bytes 對象。msg_flags 項由各種標志按位或組成,表示接收消息的情況,詳細信息請參閱系統文檔。如果接收端套接字斷開連接,則 address 是發送端套接字的地址(如果有),否則該值無指定。
某些系統上可以利用 AF_UNIX 套接字通過 sendmsg() 和 recvmsg() 在進程之間傳遞文件描述符。使用此功能時(通常僅限于 SOCK_STREAM 套接字),recvmsg() 將在其輔助數據中返回以下格式的項 (socket.SOL_SOCKET, socket.SCM_RIGHTS, fds),其中 fds 是一個 bytes 對象,是新文件描述符表示為原生 C int 類型的二進制數組。如果 recvmsg() 在系統調用返回后拋出異常,它將首先關閉此機制接收到的所有文件描述符。
- socket.recvmsg_into(buffers[, ancbufsize[, flags]])
從套接字接收普通數據和輔助數據,其行為與 recvmsg() 相同,但將非輔助數據分散到一系列緩沖區中,而不是返回新的字節對象。buffers 參數必須是可迭代對象,它迭代出可供寫入的緩沖區(如 bytearray 對象),這些緩沖區將被連續的非輔助數據塊填充,直到數據全部寫完或緩沖區用完為止。在允許使用的緩沖區數量上,操作系統可能會有限制( sysconf() 的 SC_IOV_MAX 值)。ancbufsize 和 flags 參數的含義與 recvmsg() 中的相同。
- socket.recvfrom_into(buffer[, nbytes[, flags]])
從套接字接收數據,將其寫入 buffer 而不是創建新的字節串。返回值是一對 (nbytes, address),其中 nbytes 是收到的字節數,address 是發送端套接字的地址。可選參數 flags 的含義請參閱 Unix 手冊頁 recv(2),它默認為零。( address 的格式取決于地址簇 —— 參見上文)
- socket.recv_into(buffer[, nbytes[, flags]])
從套接字接收至多 nbytes 個字節,將其寫入緩沖區而不是創建新的字節串。如果 nbytes 未指定(或指定為 0),則接收至所給緩沖區的最大可用大小。返回接收到的字節數。可選參數 flags 的含義請參閱 Unix 手冊頁 recv(2),它默認為零。
- socket.send(bytes[, flags])
發送數據給套接字。本套接字必須已連接到遠程套接字。可選參數 flags 的含義與上述 recv() 中的相同。本方法返回已發送的字節數。應用程序要負責檢查所有數據是否已發送,如果僅傳輸了部分數據,程序需要自行嘗試傳輸其余數據。有關該主題的更多信息,請參考 套接字編程指南。
在 3.5 版更改: 如果系統調用被中斷,但信號處理程序沒有觸發異常,此方法現在會重試系統調用,而不是觸發 InterruptedError 異常 (原因詳見 PEP 475)。
- socket.sendall(bytes[, flags])
發送數據給套接字。本套接字必須已連接到遠程套接字。可選參數 flags 的含義與上述 recv() 中的相同。與 send() 不同,本方法持續從 bytes 發送數據,直到所有數據都已發送或發生錯誤為止。成功后會返回 None。出錯后會拋出一個異常,此時并沒有辦法確定成功發送了多少數據。
在 3.5 版更改: 每次成功發送數據后,套接字超時不再重置。現在,套接字超時是發送所有數據的最大總持續時間。
在 3.5 版更改: 如果系統調用被中斷,但信號處理程序沒有觸發異常,此方法現在會重試系統調用,而不是觸發 InterruptedError 異常 (原因詳見 PEP 475)。
- socket.sendto(bytes, address)
- socket.sendto(bytes, flags, address)
發送數據給套接字。本套接字不應連接到遠程套接字,而應由 address 指定目標套接字。可選參數 flags 的含義與上述 recv() 中的相同。本方法返回已發送的字節數。( address 的格式取決于地址簇 —— 參見上文。)
在 3.5 版更改: 如果系統調用被中斷,但信號處理程序沒有觸發異常,此方法現在會重試系統調用,而不是觸發 InterruptedError 異常 (原因詳見 PEP 475)。
- socket.sendmsg(buffers[, ancdata[, flags[, address]]])
將普通數據和輔助數據發送給套接字,將從一系列緩沖區中收集非輔助數據,并將其拼接為一條消息。buffers 參數指定的非輔助數據應為可迭代的 字節類對象 (如 bytes 對象),在允許使用的緩沖區數量上,操作系統可能會有限制( sysconf() 的 SC_IOV_MAX 值)。ancdata 參數指定的輔助數據(控制消息)應為可迭代對象,迭代出零個或多個 (cmsg_level, cmsg_type, cmsg_data) 元組,其中 cmsg_level 和 cmsg_type 是分別指定協議級別和協議類型的整數,而 cmsg_data 是保存相關數據的字節類對象。請注意,某些系統(特別是沒有 CMSG_SPACE() 的系統)可能每次調用僅支持發送一條控制消息。flags 參數默認為 0,與 send() 中的含義相同。如果 address 指定為除 None 以外的值,它將作為消息的目標地址。返回值是已發送的非輔助數據的字節數。
- socket.sendmsg_afalg([msg, ]*, op[, iv[, assoclen[, flags]]])
為 AF_ALG 套接字定制的 sendmsg() 版本。可為 AF_ALG 套接字設置模式、IV、AEAD 關聯數據的長度和標志位。
- socket.sendfile(file, offset=0, count=None)
使用高性能的 os.sendfile 發送文件,直到達到文件的 EOF 為止,返回已發送的字節總數。file 必須是一個以二進制模式打開的常規文件對象。如果 os.sendfile 不可用(如 Windows)或 file 不是常規文件,將使用 send() 代替。offset 指示從哪里開始讀取文件。如果指定了 count,它確定了要發送的字節總數,而不會持續發送直到達到文件的 EOF。返回時或發生錯誤時,文件位置將更新,在這種情況下,file.tell() 可用于確定已發送的字節數。套接字必須為 SOCK_STREAM 類型。不支持非阻塞的套接字。
- socket.set_inheritable(inheritable)
設置套接字文件描述符或套接字句柄的 可繼承標志。
- socket.setblocking(flag)
設置套接字為阻塞或非阻塞模式:如果 flag 為 false,則將套接字設置為非阻塞,否則設置為阻塞。
本方法是某些 settimeout() 調用的簡寫:
sock.setblocking(True) 相當于 sock.settimeout(None)
sock.setblocking(False) 相當于 sock.settimeout(0.0)
- socket.settimeout(value)
為阻塞套接字的操作設置超時。value 參數可以是非負浮點數,表示秒,也可以是 None。如果賦為一個非零值,那么如果在操作完成前超過了超時時間 value,后續的套接字操作將拋出 timeout 異常。如果賦為 0,則套接字將處于非阻塞模式。如果指定為 None,則套接字將處于阻塞模式。
- socket.shutdown(how)
關閉一半或全部的連接。如果 how 為 SHUT_RD,則后續不再允許接收。如果 how 為 SHUT_WR,則后續不再允許發送。如果 how 為 SHUT_RDWR,則后續的發送和接收都不允許。
- socket.share(process_id)
復制套接字,并準備將其與目標進程共享。目標進程必須以 process_id 形式提供。然后可以利用某種形式的進程間通信,將返回的字節對象傳遞給目標進程,還可以使用 fromshare() 在新進程中重新創建套接字。一旦本方法調用完畢,就可以安全地將套接字關閉,因為操作系統已經為目標進程復制了該套接字。
關于套接字超時的說明
一個套接字對象可以處于以下三種模式之一:阻塞、非阻塞或超時。套接字默認以阻塞模式創建,但是可以調用 setdefaulttimeout() 來更改。
在 blocking mode (阻塞模式)中,操作將阻塞,直到操作完成或系統返回錯誤(如連接超時)。
在 non-blocking mode (非阻塞模式)中,如果操作無法立即完成,則操作將失敗(不幸的是,不同系統返回的錯誤不同):位于 select 中的函數可用于了解套接字何時以及是否可以讀取或寫入。
在 timeout mode (超時模式)下,如果無法在指定的超時內完成操作(拋出 timeout 異常),或如果系統返回錯誤,則操作將失敗。
- 超時與 connect 方法
connect() 操作也受超時設置的約束,通常建議在調用 connect() 之前調用 settimeout(),或將超時參數直接傳遞給 create_connection()。但是,無論 Python 套接字超時設置如何,系統網絡棧都有可能返回自帶的連接超時錯誤。
- 超時與 accept 方法
如果 getdefaulttimeout() 的值不是 None,則 accept() 方法返回的套接字將繼承該超時值。若是 None,返回的套接字行為取決于偵聽套接字的設置:
如果偵聽套接字處于 阻塞模式 或 超時模式,則 accept() 返回的套接字處于 阻塞模式;
如果偵聽套接字處于 非阻塞模式,那么 accept() 返回的套接字是阻塞還是非阻塞取決于操作系統。如果要確保跨平臺時的正確行為,建議手動覆蓋此設置。
總結
以上是生活随笔為你收集整理的向一个无法连接的网络尝试了一个套接字操作_python3从零学习-5.8.1、socket—底层网络接口...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wangka bios怎么设置 Wang
- 下一篇: 颍上县杨湖中学附近有房子出租吗?