使用SO_SNDBUF发送到非阻塞UNIX soket时发生BlockingIOError

时间:2016-05-18 20:55:37

标签: sockets unix blocking nonblocking

我使用非阻塞UNIX UDP套接字将数据从一个进程传输到另一个进程:

audio_s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
audio_s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 5500000)
audio_s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 5500000)
audio_s.setblocking(0)
try:
    os.remove(SOCKET_PATH)
except FileNotFoundError as e:
    pass
audio_s.bind(SOCKET_PATH)

我经常将数据发送到远程进程:

audio_s.sendto(data, REMOTE_SOCKET_PATH)

但有时(非常罕见)我会在BlockingIOError: [Errno 11] Resource temporarily unavailable来电时抓住sendto。这可能是什么原因? Resource temporarily unavailable看起来非常通用。

  1. 是否可以了解更详细的信息?例如发送缓冲区溢出的远程接收缓冲区溢出?这些可能的理由吗?或只有其中一个?
  2. 我可以控制发送/接收缓冲区中的当前数据报计数吗?
  3. 处理或避免这种情况的正确方法是什么?
  4. 如果我删除行:

    audio_s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 5500000)
    

    没有此例外

1 个答案:

答案 0 :(得分:0)

Errno 11是EAGAIN,来自'man sendto':

  

[EAGAIN]套接字被标记为非阻塞,请求的操作将被阻止。

有很好的解释: When a non-blocking send() only transfers partial data, can we assume it would return EWOULDBLOCK the next call? 那里: EAGAIN Error: Using Berkeley Socket API