[英]non-blocking socket,error is always
sock.setblocking(0)
try:
data = sock.recv(1024)
except socket.error, e:
if e.args[0] == errno.EWOULDBLOCK:
print 'EWOULDBLOCK'
else:
if not data: #recv over
sock.close()
print 'close================='
else:
print 'recv ---data---------'
poem += data
所有上面的代碼都在循環中。 non-blocking socket
(只是想測試'非阻塞套接字')來獲取數據。 但總是打印'EWOULDBLOCK',我不知道為什么?
套接字是非阻塞的,因此如果沒有要讀取的數據, recv()
將引發異常。 請注意,errno.EWOULDBLOCK = errno.EAGAIN = 11.這是Python(實際上是操作系統)告訴您稍后再次嘗試recv()
。
我注意到每次出現此異常時都會關閉套接字。 這根本沒有幫助。 你的代碼應該是這樣的:
import socket, errno, time
sock = socket.socket()
sock.connect(('hostname', 1234))
sock.setblocking(0)
while True:
try:
data = sock.recv(1024)
if not data:
print "connection closed"
sock.close()
break
else:
print "Received %d bytes: '%s'" % (len(data), data)
except socket.error, e:
if e.args[0] == errno.EWOULDBLOCK:
print 'EWOULDBLOCK'
time.sleep(1) # short delay, no tight loops
else:
print e
break
對於這種事情, select
模塊通常是要走的路。
設計會引發異常,因為您使用non-blocking IO
。
主要的機械差異是send,recv,connect和accept可以在沒有做任何事情的情況下返回。 你(當然)有很多選擇。 您可以檢查返回代碼和錯誤代碼,通常會讓自己發瘋。
如果你運行man errno 3
,你將看到EWOULDBLOCK
的描述。 這個例外是合理的,因為還沒有數據可供閱讀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.