簡體   English   中英

套接字錯誤errno.EWOULDBLOCK

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM