Socket相關操做超時

針對連接(connect)時候的超時:python

# 法一:
import socket

socket.setdefaulttimeout(5)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, port))
sock.sendall('xxx')
sock.recv(1024)
sock.close()

'''
20160716 update
socket.setdefaulttimeout(5) 此句必須放到創建連接的前面,不然超時設置無效果
'''
# 法二:
import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(5)
sock.connect((host, port))
# 恢復默認超時設置,設置某些狀況下socket進入阻塞模式(如makefile)
sock.settimeout(None)
sock.connect((host, port))
sock.sendall('xxx')
sock.recv(1024)
sock.close()

針對接收(recv)數據時的超時:socket

# 法一:
import socket

socket.setdefaulttimeout(5)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, port))
sock.sendall('xxx')
# 鏈接和接收的時候都設置一次超時
sock.settimeout(5)
sock.recv(1024)
sock.close()
# 法二[未驗證]:
import select

mysocket.setblocking(0)

ready = select.select([mysocket], [], [], timeout_in_seconds)
if ready[0]:
    data = mysocket.recv(4096)

參考連接:code

        http://stackoverflow.com/questions/2719017/how-to-set-timeout-on-pythons-socket-recv-methodio

相關文章
相關標籤/搜索