python socket 編程

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软舌,typeproto和上述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鸳玩,typeproto和上述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總是在右邊鼻忠。

image
image

對于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岛啸,socketypeproto茴肥,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中鸵隧,否則返回 '' 绸罗。如果familyAF_INETsockaddr(address, port)豆瘫;如果familyAF_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_addressaliaslist是一組對應(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),levelIPPROTO_TCP伺糠。對于IP蒙谓,levelIPPROTO_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ù)modebufsize和大開文件的方法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ù)falgsrecv()相同艘策。函數(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異常。如果valueNone嗅骄,則會禁用超時胳挎。settimeout(0.0)效果和setblocking(0)一樣。settimeout(None)的效果和setblocking(1)一樣溺森。
  • socket.gettimeout()返回設(shè)置的超時時間慕爬。返回的值和setblocking()settimeout()相關(guān)屏积。
  • socket.setsockopt(level, optname, value)用給定的參數(shù)設(shè)置socket的配置医窿。所需的配置常量在socketmodule中(SO_*etc.)。value可以是一個整數(shù)或者一個字符串表示的buffer炊林。如果是一個buffer姥卢,將有調(diào)用著來驗(yàn)證字符串是否包含正確的位(bits)。
  • socket.shutdown(how)完全關(guān)閉連接或者關(guān)閉一半渣聚。如果howSHUT_RD隔显,將不能接收數(shù)據(jù)。如果howSHUT_WR饵逐,將不能發(fā)送數(shù)據(jù)括眠。如果是SHUT_RDWD,發(fā)送和接收都不允許倍权。

作者:JianMing
鏈接:http://www.reibang.com/p/9207700ec26d
來源:簡書
簡書著作權(quán)歸作者所有掷豺,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末薄声,一起剝皮案震驚了整個濱河市当船,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌默辨,老刑警劉巖德频,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缩幸,居然都是意外死亡壹置,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門表谊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钞护,“玉大人,你說我怎么就攤上這事爆办∧压荆” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長余佃。 經(jīng)常有香客問我暮刃,道長,這世上最難降的妖魔是什么爆土? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任沾歪,我火速辦了婚禮,結(jié)果婚禮上雾消,老公的妹妹穿的比我還像新娘。我一直安慰自己挫望,他們只是感情好立润,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著媳板,像睡著了一般桑腮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蛉幸,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天破讨,我揣著相機(jī)與錄音,去河邊找鬼奕纫。 笑死提陶,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的匹层。 我是一名探鬼主播隙笆,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼升筏!你這毒婦竟也來了撑柔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤您访,失蹤者是張志新(化名)和其女友劉穎铅忿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灵汪,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡檀训,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了享言。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肢扯。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖担锤,靈堂內(nèi)的尸體忽然破棺而出蔚晨,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布铭腕,位于F島的核電站银择,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏累舷。R本人自食惡果不足惜浩考,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望被盈。 院中可真熱鬧析孽,春花似錦、人聲如沸只怎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽身堡。三九已至邓尤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贴谎,已是汗流浹背汞扎。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留擅这,地道東北人澈魄。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像仲翎,于是被迫代替她去往敵國和親一忱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Socket創(chuàng)建函數(shù) socket.socket(socket_family, socket_type, prot...
    JianMing閱讀 6,011評論 1 13
  • 基礎(chǔ)知識 計(jì)算機(jī)網(wǎng)絡(luò) A:IP地址 (1) 用來標(biāo)識網(wǎng)絡(luò)上一臺獨(dú)立的主機(jī) C: 傳輸協(xié)議:通訊的規(guī)則谭确。例如:T...
    So_ProbuING閱讀 1,282評論 0 1
  • 網(wǎng)絡(luò)編程 一.楔子 你現(xiàn)在已經(jīng)學(xué)會了寫python代碼逐哈,假如你寫了兩個python文件a.py和b.py芬迄,分別去運(yùn)...
    go以恒閱讀 2,016評論 0 6
  • 通過python的網(wǎng)絡(luò)通信支持,通過網(wǎng)絡(luò)模塊昂秃,python程序可以非常方便地相互訪問互聯(lián)網(wǎng)上的HTTP服務(wù)和FTP...
    原來不語閱讀 10,368評論 0 3
  • 今天吃飯時禀梳,女朋友特意提醒我說,你好久沒更新微信公眾號啦肠骆! 誰說不是呢算途?其實(shí)我并不是沒時間,而是我不想寫蚀腿,因?yàn)槲腋?..
    端銀閱讀 193評論 0 0