Socket創(chuàng)建函數(shù)
-
socket.socket(socket_family, socket_type, protocol=0)
創(chuàng)建一個socket對象伸蚯。socket_family
是選擇地址族(所以都是AF_開頭)终惑,是不同的域(domain)拯杠。域決定者通信的特征抱冷,包括地址格式汗菜。參數(shù)socket_type
是確定套接字的類型派桩,進(jìn)一步確定通信特征构诚。protocol
通常是0,表示為給定的域和套接字類型選擇默認(rèn)協(xié)議铆惑。當(dāng)對同一域和套接字類型支持多個協(xié)議時范嘱,可以使用protocol選擇一個特定的協(xié)議。在AF_INET通信域中员魏,套接字類型SOCK_STREAM的默認(rèn)協(xié)議時傳輸控制協(xié)議(Transmission Control Protocol丑蛤, TCP)。在AF_INET通信域中撕阎,套接字類型SOCK_DGRAM的默認(rèn)協(xié)議是UDP.
socket_family(address family受裹,地址族) | 意義 |
---|---|
socket.AF_UNIX | UNIX域(只能夠用于單一的Unix系統(tǒng)進(jìn)程間通信),地址由單獨(dú)一個string表示 |
socket.AF_INET | IPv4因特網(wǎng)域 (服務(wù)器之間網(wǎng)絡(luò)通信),地址由(host, port) 表示 |
socket.AF_INET6 | IPv6因特網(wǎng)域棉饶,地址由(host, port, flowinfo, scopeid) 表示 |
socket.AF_UNSPEC | 未指定協(xié)議 |
socket_type | 意義 |
---|---|
socket.SOCK_STREAM | 有序的厦章,可靠的,雙向的照藻,面向連接的字節(jié)流(默認(rèn)TCP協(xié)議) |
socket.SOCK_DGRAM | 固定長度的袜啃,無連接的,不可開的報文傳遞 |
socket.SOCK_RAW | IP協(xié)議的數(shù)據(jù)報接口 |
socket.SOCK_SEQPACKET | 固定長度的幸缕,有序的群发,可靠的,面向連接的報文傳遞 |
protocol | 意義 |
---|---|
IPPROTO_IP | IPv4協(xié)議 |
IPPROTO_IPV6 | IPv6協(xié)議 |
IPPROTO_ICMP | 因特網(wǎng)控制報文協(xié)議(Internet Control Message Protocol) |
IPPROTO_RAW | 原始IP數(shù)據(jù)包協(xié)議 |
IPPROTO_TCP | 傳輸控制協(xié)議 |
IPPROTO_UDP | 用戶數(shù)據(jù)報協(xié)議 |
- 對于SOCK_DGRAM(數(shù)據(jù)報)接口发乔,兩個對等進(jìn)程之間同你不需要邏輯連接熟妓。只需要向?qū)Φ冗M(jìn)程所使用的套接字送出一個報文。因此SOCK_DGRAM提供了一個無連接的服務(wù)栏尚。
- 對于SOCK_STREAM(字節(jié)流)接口起愈,要求在交換數(shù)據(jù)之前荤傲,在本地套接字和通信的對等進(jìn)程的套接字之間建立一個邏輯連接武花。由于SOCK_TREAM套接字提供字節(jié)流服務(wù)约啊,所以應(yīng)用程序分辨不出報文的界限健蕊。這意味者從SOCK_STREAM套接字讀取數(shù)據(jù)時,它也許不會返回所有由發(fā)送進(jìn)程所寫的字節(jié)數(shù)掰曾。最終可以獲得發(fā)送過來的所有數(shù)據(jù),但也需要通過若干次函數(shù)調(diào)用才能得到。
- SOCK_SEQPACKET套接字和SOCK_STREAM套接字很類似产艾,只是從套接字得到的是基于報文的服務(wù)而不是字節(jié)流的服務(wù)。這意味著從SOCK_SEQPACKET套接字接受的數(shù)據(jù)量與對方發(fā)送的一致滑绒。流控制傳輸協(xié)議(Stream Control Transmission Protocol闷堡, SCTP)提供了因特網(wǎng)上的順序數(shù)據(jù)包服務(wù)。
- SOCK_RAW套接字提供一個數(shù)據(jù)報接口疑故,用于直接訪問下面的網(wǎng)絡(luò)層(IP層)杠览。使用這個接口的時候,應(yīng)用程序負(fù)責(zé)構(gòu)造自己的協(xié)議頭部纵势。PS:需要有超級管理員權(quán)限踱阿,防止惡意應(yīng)用程序繞過內(nèi)建安全機(jī)制來創(chuàng)建報文。
其他創(chuàng)建socket函數(shù)
-
socket.socketpair([family[, type[, proto]]])
創(chuàng)建一對已經(jīng)連接的socket對象(返回(socket, socket)
)钦铁,family
软舌,type
,proto
和上述socket()
一樣牛曹。部分平臺默認(rèn)的family
是AF_UNIX佛点,否則,默認(rèn)是AF_INET。例如:AF_UNIX -
socket.fromfd(fd, family, type[, proto])
復(fù)制文件描述符fd
(文件描述符fd是一個整數(shù)且有一個文件對象的fileno()
方法返回)且用此返回一個socket對象超营。family
鸳玩,type
和proto
和上述socket()
一樣。文件描述符fd
應(yīng)該是制定一個socket的演闭,但函數(shù)并沒有檢測不跟,如果這個文件描述符fd
是無效的,隨后的操作將會失敗船响。這個方法很少會用到躬拢,但是能夠用來在一個被當(dāng)作標(biāo)準(zhǔn)輸入輸出的程序的socket中設(shè)置或獲取配置(如:一個由Unix inet daemon啟動的服務(wù))。socket被假設(shè)為阻塞模式见间。(在Unix上有效)
其他函數(shù)
-
socket.getdefaulttimeout()
返回下一個新的socket對象的超時時間聊闯,單位是秒(float)。如果返回是None
表示新的socket對象沒有超時米诉。第一次導(dǎo)入socket包時菱蔬,默認(rèn)是None
。 -
socket.setdefaulttimeout(timeout)
設(shè)置默認(rèn)超時時間給新的socket對象史侣,單位是秒(float)拴泌。None
表示新的socket對象沒有超時。第一次導(dǎo)入socket包時惊橱,默認(rèn)是None
蚪腐。
地址
字節(jié)序
字節(jié)序是一個處理器架構(gòu)特性,用于指示像整數(shù)這樣的大數(shù)據(jù)類型內(nèi)部的字節(jié)如何排序税朴。
大端(bing-endian)字節(jié)序回季,最大字節(jié)地址出現(xiàn)在最低有效字節(jié)(Least Significant Byte, LSB)上。
小端(little-endian)字節(jié)序正林,最低有效字節(jié)包含最小字節(jié)地址泡一。
不管字節(jié)如何排序,最高有效字節(jié)(Most Signification Byte, MSB)總是在左邊觅廓,LSB總是在右邊鼻忠。
對于TCP/IP協(xié)議棧使用大端字節(jié)序。
有下面四個函數(shù)來轉(zhuǎn)換字節(jié)序:
-
socket.ntohl(x)
:將32位正整數(shù)從網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換到主機(jī)字節(jié)序杈绸。在一些機(jī)器上的主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序是一樣的帖蔓,這將是一個空操作;否則,它執(zhí)行一個4字節(jié)交換操作瞳脓。 -
socket.ntohs(x)
:將16位正整數(shù)從網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換到主機(jī)字節(jié)序讨阻。在一些機(jī)器上的主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序是一樣的,這將是一個空操作;否則篡殷,它執(zhí)行一個2字節(jié)交換操作钝吮。 -
socket.htonl(x)
:將32位正整數(shù)從主機(jī)字節(jié)序轉(zhuǎn)換到網(wǎng)絡(luò)字節(jié)序。在一些機(jī)器上的主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序是一樣的,這將是一個空操作;否則奇瘦,它執(zhí)行一個4字節(jié)交換操作棘催。 -
socket.htons(x)
:將16位正整數(shù)從主機(jī)字節(jié)序轉(zhuǎn)換到網(wǎng)絡(luò)字節(jié)序。在一些機(jī)器上的主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序是一樣的耳标,這將是一個空操作;否則醇坝,它執(zhí)行一個2字節(jié)交換操作。
地址格式
-
socket.inet_aton(ip_string)
將一個字符串的IPv4地址(e.g:“192.168.1.1”)轉(zhuǎn)換為32位二進(jìn)制格式的字符串(在和一些采用C標(biāo)準(zhǔn)庫和需要struct in_addr
的程序交流上很有用)次坡。如果ip_string
是一個無效的ip呼猪,這將引起一個socket.error
。 -
socket.inet_ntoa(packed_ip)
將一個32位二進(jìn)制格式的字符串IPv4地址轉(zhuǎn)換成一個常用的IPv4字符串砸琅。如果這不是一個表示4byte長度的字符串宋距,將引起一個socket.error
。 -
socket.inet_pton(address_family, ip_string)
將一個對應(yīng)family
(AF_INET 或 AF_INET6)的字符串地址症脂,轉(zhuǎn)換成對應(yīng)的二進(jìn)制格式谚赎。(在*nix上) -
socket.inet_ntop(address_family, packed_ip)
將一個二進(jìn)制格式的IP地址,轉(zhuǎn)換成對應(yīng)地址族的字符串格式诱篷。(AF_INET 或 AF_INET6)
地址查詢
-
socket.getaddrinfo(host, port[, family[, socktype[, proto[, flags]]]])
根據(jù)給定的參數(shù)host/port壶唤,相應(yīng)的轉(zhuǎn)換成一個包含用于創(chuàng)建socket對象的五元組的list。-
host
可以是一個域名(e.g:"www.google.com")棕所,可以是一個IPv4或者IPv6地址的字符串闸盔,或則是None
。 -
port
可以是一個協(xié)議名(e.g:"http")琳省,可以是一個代表端口的數(shù)字蕾殴,或者是None
。 -
family
岛啸,socketype
,proto
茴肥,flags
都是一些可選的參數(shù)坚踩,來篩選結(jié)果的。默認(rèn)情況下瓤狐,它們的值都是0
瞬铸,表示所有。flags
可以是 1 個或者多個AI_*
常量础锐,這會影響結(jié)果是如何計(jì)算和返回的嗓节。默認(rèn)值是0
。
返回list的5元組結(jié)構(gòu):
(family, socktype, proto, canonname, sockaddr)
,
family
皆警,socktpye
拦宣,proto
是一個整數(shù)。canonname
是一個string,僅當(dāng)AI_CANONNAME
在參數(shù)flags
中鸵隧,否則返回 '' 绸罗。如果family
是AF_INET
,sockaddr
是(address, port)
豆瘫;如果family
是AF_INET6
珊蟀,sockaddr
是(address, port, flow, info, scope id)
; -
flag標(biāo)記 | 描述 |
---|---|
AI_ADDRCONFIG | 查詢配置的地址類型(IPv4或IPv6) |
AI_ALL | 查找 IPv4 和 IPv6 地址(僅用于AI_V4MAPPED) |
AI_CANONAME | 需要一個規(guī)范的名字(與別名相對) |
AI_NUMBERICHOST | 以數(shù)字格式指定主機(jī)地址外驱,不翻譯 |
AI_NUMBERICSERV | 將服務(wù)指定為數(shù)字端口號育灸,不翻譯 |
AI_PASSIVE | 套接字地址用于監(jiān)聽綁定 |
AI_V4MAPPED | 如果沒有找到IPv6地址,返回映射到IPv6格式的IPv4地址 |
-
socket.gethostname()
返回當(dāng)前正在執(zhí)行Python解釋器的主機(jī)名的字符串昵宇。(gethostname()
返回的可能不是一個完全的qualified主機(jī)名磅崭,詳見getfqdn()
) -
socket.getfqdn([name])
使用name
來返回一個full qualified的主機(jī)名。如果name
沒有提供或者為空趟薄,則被解釋為本地主機(jī)绽诚。為了找返回一個full qualified的主機(jī)名,由gethostbyaddr()
返回的主機(jī)名將被選中杭煎,如果有的主機(jī)有別名的話恩够,將會跟在后面。第一個返回的主機(jī)名是被選中的羡铲。如果沒有full qualified主機(jī)名可用蜂桶,將返回gethostbyaddr()
的主機(jī)名。 -
socket.gethostbyname(hostname)
將一個hostname轉(zhuǎn)換為IPv4地址格式也切。如果hostname
是一個IPv4地址扑媚,將會原封不動返回。gethostbyname()
不接受IPv6雷恃。 -
socket.gethostbyname_ex(hostname)
擴(kuò)展接口疆股。將一個hostname轉(zhuǎn)換為IPv4地址格式。返回一個三元組(hostname, aliaslist, ipaddrlist)
倒槐。hostname
是反映著返回的ip_address
旬痹。aliaslist
是一組對應(yīng)著同一個IP地址的主機(jī)別名(可能為空)。ipaddrlist
是一組對應(yīng)著同一個hostname的IPv4地址(一般情況是單一個地址)讨越。gethostbyname_ex()
只支持IPv4两残。 -
socket.gethostbyaddr(ip_address)``````hostname
是反映著返回的ip_address
。aliaslist
是一組對應(yīng)著同一個IP地址的主機(jī)別名(可能為空)把跨。ipaddrlist
是一組同一主機(jī)同一接口的IPv4/IPv6的地址列表人弓。 -
socket.getnameinfo(sockaddr, flags)
將給定的socketaddr
(為一個host和port的二元組)翻譯成一個二元組(host, port)
。根據(jù)設(shè)置和flags
着逐,結(jié)果可以保存一個full qualified的主機(jī)名或者表現(xiàn)在主機(jī)上的數(shù)字地址崔赌。同樣的意蛀,端口號可以為數(shù)字或者字符串。
flags | 描述 |
---|---|
NI_DGRAM | 服務(wù)基于數(shù)據(jù)報而非基于流 |
NI_NAMEREQD | 如果找不到主機(jī)名峰鄙,將其作為一個錯誤對待 |
NI_NOFQDN | 對于本地主機(jī)浸间,僅返回全限定域名的字節(jié)點(diǎn)部分 |
NI_NUMERICHOST | 返回主機(jī)地址的數(shù)字形式,而非主機(jī)名 |
NI_NUMERICSCOPE | 對于IPv6吟榴,返回范圍ID的數(shù)字形式魁蒜,而非名字 |
NI_NUMERICSERV | 返回服務(wù)地址的數(shù)字形式(即端口號),而非名字 |
-
socket.getprotobyname(protocolname)
將一個網(wǎng)絡(luò)協(xié)議名(例如“icmp”,"tcp")轉(zhuǎn)換成為一個固定的合適的值吩翻,給socket()
的第三個參數(shù)(可選)兜看。這個通常用在SOCK_RAW
模式,對于其他普通的socket模型狭瞎,將這個參數(shù)缺省或者設(shè)為0會自動的選擇正確的協(xié)議细移。 -
socket.getservbyname(servicename[, protocolname])
將一個網(wǎng)絡(luò)服務(wù)名(e.g: "http")和協(xié)議名轉(zhuǎn)換成一個該服務(wù)的端口號。protocolname
是可選項(xiàng)熊锭,應(yīng)該是tcp
或者udp
弧轧,否則將匹配任何協(xié)議。 -
socket.getservbyport(port[, protocolname])
將一個端口號和網(wǎng)絡(luò)協(xié)議名轉(zhuǎn)換成該端口號的服務(wù)名碗殷。protocolname
是可選項(xiàng)精绎,應(yīng)該是tcp
或者udp
,否則將匹配任何協(xié)議锌妻。
Socket對象方法
socket.accept()
接受一個連接代乃。這個socket對象必須綁定了一個地址并正在監(jiān)聽著連接。返回的值是(conn, address)
仿粹,conn
是一個用來在接連上發(fā)送接收數(shù)據(jù)的新的socket對象搁吓,address
是綁定在另外一個的socket連接的地址。socket.bind(address)
將socket綁定到一個address
吭历。這個socket必須是未綁定地址的(address
的格式如上文提到的堕仔,e.g:IPv4的格式(host, port)
)。socket.close()
關(guān)閉這個socket晌区。接下來在這個socket對象的操作都將失敗摩骨。另外一端將不在接收到數(shù)據(jù)(當(dāng)隊(duì)列中的數(shù)據(jù)都發(fā)送后)。當(dāng)socket對象被垃圾回收機(jī)制回收時契讲,將會自動關(guān)閉。socket.connect(address)
用address
連接到一個遠(yuǎn)程的socket(address
的格式如上文提到的滑频,e.g:IPv4的格式(host, port)
)socket.connect_ex(address)
類似于socket.connect(address)
捡偏,但是返回一個錯誤提示來取代引起一個C語言層connect()
的錯誤exception(其他問題,如果“host not found”峡迷,依然會引起exception)银伟。如果返回的錯誤提示時0
則操作成功你虹,其他則是errno
變量。這是一個有用的支持彤避,比如傅物,異步連接。socket.fileno()
返回一個socket對象的文件描述符(一個整數(shù))琉预。在做多路復(fù)用socket(select
,poll
,epoll
)下有用董饰。在Window下,這個方法返回的整數(shù)不能當(dāng)做文件描述符來使用(比如os.fdopen()
)圆米。Unix下沒有這個限制卒暂。socket.getpeername()
返回socket連接的遠(yuǎn)程address
。這是有用的娄帖,例如找出遠(yuǎn)程的IPv4/v6 socket的端口號(返回的address
格式依賴于地址族-如上述)也祠。這個方法在某些平臺上不支持。socket.getsockname()
返回socket綁定的address
近速。這是有用的诈嘿,例如找IPv4/v6 socket的端口號(返回的address
格式依賴于地址族-如上述)。socket.getsockopt(level, optname[, buflen])
返回指定socket選項(xiàng)的值削葱。optname
所需要的 symbolic 常量(so_*
)都在本module中奖亚。如果buflen
缺省,將會假定是一個整數(shù)的設(shè)置佩耳,并且這個函數(shù)是返回一個整數(shù)的遂蛀。如果buflen
設(shè)置了,它指定用于接收緩沖的最大長度干厚。需要由調(diào)用者來對這個緩沖的內(nèi)容進(jìn)行解碼李滴。-
socket.setsockopt(level, optname, value)
設(shè)置給定socket選項(xiàng)的值。optname
所需要的 symbolic 常量(so_*
)都在本module中蛮瞄。value
可以是一個整數(shù)(integer)或者表示緩沖(buffer)的字符串(string)所坯。在后一種情況(指字符串的情況),它是由調(diào)用者來保證字符串包含著正確的位(bits)挂捅。參數(shù)
level
標(biāo)識了選項(xiàng)應(yīng)用的協(xié)議芹助。如果是通用的套接字層次選項(xiàng),則level
設(shè)置成SOL_SOCKET
闲先,否則level
設(shè)置成控制這個選項(xiàng)的協(xié)議編號状土。對于TCP選項(xiàng),level
是IPPROTO_TCP
伺糠。對于IP蒙谓,level
是IPPROTO_IP
等等。
選項(xiàng) | 參數(shù)value的類型 | 描述 |
---|---|---|
SO_ACCEPTCONN | integer | 返回信息指示該套接字是否能被監(jiān)聽(僅getsockopt() ) |
SO_BROADCAST | integer | 如果value非0训桶,廣播數(shù)據(jù)包 |
SO_DEBUG | integer | 如果value非0累驮,啟動網(wǎng)絡(luò)驅(qū)動調(diào)試功能 |
SO_DONTROUTE | integer | 如果返回的value非0酣倾,繞過通常路由 |
SO_ERROR | integer | 返回掛起的套接字錯誤并清除(僅getsockopt ) |
SO_KEEPALIVE | integer | 如果value非0,啟動周期性keep-alive報文 |
SO_LINGER | stirng | 當(dāng)還有未發(fā)送報文二套接字已關(guān)閉時谤专,延遲時間 |
SO_OOBINLINE | integer | 當(dāng)value非0躁锡,將帶外數(shù)據(jù)放在普通數(shù)據(jù)中 |
SO_RCVBUF | integer | 接受緩沖區(qū)的字節(jié)長度 |
SO_RCVLOWAT | integer | 接收調(diào)用中返回的最小數(shù)據(jù)字節(jié)數(shù) |
SO_RCVTIMEO | string | 套接字接收調(diào)用的超時值 |
SO_REUSEADDR | integer | 如果value非0,重用bind中的地址 |
SO_SNDBUF | integer | 發(fā)送緩沖區(qū)的字節(jié)長度 |
SO_SNDLOWAT | integer | 發(fā)送調(diào)用中傳送的最小數(shù)據(jù)字節(jié)數(shù) |
SO_SNDTIMEO | string | 套接字發(fā)送調(diào)用的超時值 |
SO_TYPE | integer | 表示套接字類型(僅getsockopt ) |
socket.listen(backlog)
監(jiān)聽Socket進(jìn)行的連接置侍。backlog
指定連接隊(duì)列的最大值映之,至少為0。最大值取決于系統(tǒng)(通常為5)墅垮。最小值被強(qiáng)制為0惕医。socket.makefile([mode[, bufsize]])
返回與socket相關(guān)聯(lián)的文件對象。這個文件對象只有調(diào)用close()
方法才會被關(guān)閉算色,但這個關(guān)閉只是刪除與socket的關(guān)聯(lián)抬伺,所以只有在這個socket沒有在其他地方被引用時,socket才會關(guān)閉灾梦。
這個socket必須在阻塞模式(不能有超時)峡钓。可選參數(shù)mode
和bufsize
和大開文件的方法file()
若河,open
一樣能岩。socket.recv(bufsize[, flags])
接收來自socket的數(shù)據(jù)。接收的數(shù)據(jù)以string類型表示萧福。一次接收數(shù)據(jù)的最大數(shù)量由bufsize
決定拉鹃。flags
的默認(rèn)值為0,flags
的標(biāo)志如下表鲫忍。
標(biāo)志 | 描述(Linux下) |
---|---|
MSG_CMSG_CLOEXEC | 為UNIX域套接字上接收的文件描述符設(shè)置執(zhí)行時關(guān)閉標(biāo)志 |
MSG_DONTWAIT | 啟動非阻塞操作(相當(dāng)于使用O_NONBLOCK) |
MSG_ERRQUEUE | 接受錯誤信息作為輔助數(shù)據(jù) |
MSG_OOB | 如果協(xié)議支持膏燕,獲取帶外數(shù)據(jù) |
MSG_PEEK | 返回?cái)?shù)據(jù)內(nèi)容而不是真正取走數(shù)據(jù) |
MSG_TRUNC | 即使數(shù)據(jù)包被截?cái)啵卜祷財(cái)?shù)據(jù)包的實(shí)際長度 |
MSG_WAITALL | 等待直到所有數(shù)據(jù)可能(僅SOCK_STREAM) |
-
socket.recvfrom(bufsize[, flags])
接收來自socket的數(shù)據(jù)悟民。返回的值時一個二元組(string, address)
坝辫,string
表示的是接收的數(shù)據(jù),address
則是發(fā)送數(shù)據(jù)的socket的地址射亏。參數(shù)的詳解參見```socket.recv(bufsize[, flags])````近忙。 -
socket.recvfrom_into(buffer[, nbytes[, flags]])
接收來自socket的數(shù)據(jù),將接收的數(shù)據(jù)寫入到buffer
中智润,而不是返回一個string
及舍。返回值的一個二元組(nbytes, address)
,nbytes
是接收的的字節(jié)數(shù),address
則是發(fā)送數(shù)據(jù)的socket的地址窟绷。flags
參數(shù)的詳解參見```socket.recv(bufsize[, flags])````锯玛。 -
socket.send(string[, flags])
發(fā)送數(shù)據(jù)到socket。這個socket對象必須已經(jīng)與一個遠(yuǎn)程的socket對象連接钾麸「瘢可選參數(shù)flags
和函數(shù)recv()
中的一樣。這個函數(shù)會返回發(fā)送數(shù)據(jù)的字節(jié)數(shù)饭尝。應(yīng)用程序需要自己負(fù)責(zé)檢查是否所有數(shù)據(jù)已經(jīng)被發(fā)送肯腕,如果只有一部分?jǐn)?shù)據(jù)發(fā)送了,應(yīng)用程序需要嘗試將剩余的數(shù)據(jù)輸送出去钥平。 -
socket.sendall(string[, flags])
發(fā)送數(shù)據(jù)到socket实撒。這個socket對象必須已經(jīng)與一個遠(yuǎn)程的socket對象連接∩骜可選參數(shù)flags
和函數(shù)recv()
中的一樣知态。和send()
不同的是,這個方法將會一直發(fā)送數(shù)據(jù)直到所有數(shù)據(jù)都發(fā)送完或者有錯誤出現(xiàn)立叛。如果成功則返回None
负敏。如果錯誤,將會引起一個異常(exception)秘蛇,但這樣將沒有辦法獲知有多少數(shù)據(jù)是成功被發(fā)送的其做。 -
socket.sendto(string, address)
和socket.sendto(string, flags, address)
發(fā)送數(shù)據(jù)到socket,這個socket必須是沒有與遠(yuǎn)程的socket連接的赁还,目標(biāo)socket由address
來決定妖泄。可選參數(shù)falgs
與recv()
相同艘策。函數(shù)返回的結(jié)果是發(fā)送數(shù)據(jù)的字節(jié)數(shù)蹈胡。(address
的格式由地址族決定,看上文) - ````socket.setblocking(flag)
將這個socket設(shè)置為**阻塞**或**非阻塞**:如果
flag設(shè)為
0朋蔫,那個它是**非阻塞**罚渐,其他則為**阻塞**。所有的socket默認(rèn)是**阻塞**的斑举。在***非阻塞***模式下搅轿,如果調(diào)用
recv()沒有接收到數(shù)據(jù),或者
send()不能立刻的發(fā)送數(shù)據(jù)富玷,一個
error一個將會引起璧坟。在**阻塞**模式下,這些方法將會阻塞知道它們能夠處理赎懦。
socket.setblocking(0)的效果和
socket.setblocking(0.0)一樣雀鹃。
socket.setblocking(1)的效果和
socket.setblocking(None)```一樣。 -
socket.settimeout(value)
為阻塞的socket設(shè)置一個超時時間励两。value
可以是一個非負(fù)float表示的數(shù)字黎茎,單位是秒,也可以是None
当悔。如果給socket設(shè)定一個超時時間(float)傅瞻,一連串的阻塞方法的處理時間超過這個值踢代,將會引起一個timeout
異常。如果value
是None
嗅骄,則會禁用超時胳挎。settimeout(0.0)
效果和setblocking(0)
一樣。settimeout(None)
的效果和setblocking(1)
一樣溺森。 -
socket.gettimeout()
返回設(shè)置的超時時間慕爬。返回的值和setblocking()
,settimeout()
相關(guān)屏积。 -
socket.setsockopt(level, optname, value)
用給定的參數(shù)設(shè)置socket的配置医窿。所需的配置常量在socket
module中(SO_*
etc.)。value
可以是一個整數(shù)或者一個字符串表示的buffer炊林。如果是一個buffer姥卢,將有調(diào)用著來驗(yàn)證字符串是否包含正確的位(bits)。 -
socket.shutdown(how)
完全關(guān)閉連接或者關(guān)閉一半渣聚。如果how
是SHUT_RD
隔显,將不能接收數(shù)據(jù)。如果how
是SHUT_WR
饵逐,將不能發(fā)送數(shù)據(jù)括眠。如果是SHUT_RDWD,發(fā)送和接收都不允許倍权。
作者:JianMing
鏈接:http://www.reibang.com/p/9207700ec26d
來源:簡書
簡書著作權(quán)歸作者所有掷豺,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。