要设置非阻塞模式,可以使用fcntl
函数来设置套接字的属性。
以下是一个使用recvfrom
设置非阻塞的示例:
import socket import fcntl import os # 创建套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定地址和端口 sock.bind(('127.0.0.1', 8888)) # 设置非阻塞模式 fcntl.fcntl(sock, fcntl.F_SETFL, os.O_NONBLOCK) # 接收数据 try: data, addr = sock.recvfrom(1024) except socket.error as e: if isinstance(e.args, tuple): if e == socket.error(errno.EWOULDBLOCK): # 表示没有数据可读 pass else: print(e) else: # 处理接收到的数据 print('Received:', data.decode()) # 关闭套接字 sock.close()
在上述示例中,使用fcntl.fcntl
函数将套接字的属性设置为非阻塞模式。这样,在调用recvfrom
方法时,如果没有数据可读取,会立即返回一个错误。通过捕获socket.error
异常并检查错误代码,可以判断是否是非阻塞模式下的超时情况。