[英]socket.error errno.EWOULDBLOCK
我正在閱讀一些代碼,並且遇到了這一行
socket.error errno.EWOULDBLOCK
誰能告訴我引發此錯誤的條件是什么?
從Python的套接字模塊中: http : //docs.python.org/library/socket.html
最初,所有套接字都處於阻塞模式。 在非阻塞模式下,如果recv()調用未找到任何數據,或者如果send()調用無法立即處理數據, 則會引發錯誤異常 。
它所指的錯誤異常是errno.EWOULDBLOCK
為此,必須使用以下方法將套接字對象設置為非阻塞模式: socketObj.setblocking(0)
請注意,EWOULDBLOCK是錯誤號11:
In [80]: import errno
In [83]: errno.EWOULDBLOCK
Out[84]: 11
並且相關的錯誤消息是:
In [86]: import os
In [87]: os.strerror(errno.EWOULDBLOCK)
Out[89]: 'Resource temporarily unavailable'
這是一些玩具代碼,顯示EWOULDBLOCK錯誤。 它設置服務器和客戶端,嘗試通過套接字連接相互通信。 當s.setblocking(0)
將套接字置於非阻塞模式時,隨后對s.recv
調用將引發socket.error
。 我認為發生這種情況是因為連接的兩端都試圖接收數據:
import socket
import multiprocessing as mp
import sys
import time
def server():
HOST='localhost'
PORT=6000
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr=s.accept()
while True:
data=conn.recv(1024)
if data:
conn.send(data)
conn.close()
def client():
HOST='localhost'
PORT=6000
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.setblocking(0) # Comment this out, and the EWOULDBLOCK error goes away
s.send('Hello, world')
try:
data=s.recv(1024)
except socket.error as err:
print(err)
# [Errno 11] Resource temporarily unavailable
sys.exit()
finally:
s.close()
print('Received {0}'.format(repr(data)))
def run():
server_process=mp.Process(target=server)
server_process.daemon=True
server_process.start()
time.sleep(0.1)
client()
run()
如果s.setblocking(0)
被注釋掉,您應該看到
Received 'Hello, world'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.