python socket 非阻塞 socket.error: [Errno 11] Resource temporarily unavailable”

一、问题再现:socket接受数据被阻塞

正常的TCP服务器端代码如下

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) #设置端口复用,必须程序2min内无法长期
s.bind(('', 12345))
s.listen(5)
print("waiting for connection!!!")
while True:
    sock, addr = s.accept()
    print("receive connection from %s:%s" % addr)
    data = sock.recv(1024)

当Client没有发送数据时,Server会阻塞地等待接收数据,也就是程序会停在data = sock.recv(1024)这一行代码

现在有一个业务需求,需要无阻塞的接受数据:有数据,则接受;无数据,则跳过这一行

二、无阻塞接受数据

经过资料查询,其实只需要增加一个参数

data = sock.recv(1024, 0x40)

目前官方关于这个参数的解释不多,目前仅仅是拿过来使用
如果直接使用的话,会报一个错误

[Errno 11] Resource temporarily unavailable

产生这个错误的原因是:你希望可以立即接受信息,但是实际上此时并没有信息传送过来,超时报错
对非阻塞socket而言,这个不是一种错误,也不会破坏socket的同步,不用管它
可以搭配try...except使用

try:
    data = sock.recv(4096, 0x40)
except BlockingIOError as e:
    data = None

参考资料:
[Python]关于socket.recv()的非阻塞用法
socket Resource temporarily unavailable,errno代码为11(EAGAIN)
Python error: “socket.error: [Errno 11] Resource temporarily unavailable” when sending image

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。