Python中的非阻塞套接字?

Pwn*_*nna 7 python sockets

是我,还是我在python中找不到关于非阻塞套接字的好教程?

我不确定如何正确地使用它.recv.send它.根据python文档,(我对它的理解,至少)recv'ed或send'ed数据可能只是部分数据.所以这意味着我必须以某种方式连接数据,同时recv确保所有数据都通过输入send.如果是这样,怎么样?一个例子将非常感激.

tom*_*asz 8

如果您的套接字处于非阻塞模式并不重要,recv/send工作几乎相同; 唯一的区别是非阻塞套接字抛出'资源暂时不可用'错误而不是等待数据/套接字.

recv方法返回接收的字节数,告知它们小于或等于传递的bufsize.如果要接收完全大小的字节,则应该执行类似于以下代码的操作:

def recvall(sock, size):
  data = ''
  while len(data) < size:
    d = sock.recv(size - len(data))
    if not d:
      # Connection closed by remote host, do what best for you
      return None
    data += d
  return data
Run Code Online (Sandbox Code Playgroud)

重要的是要记住,在阻塞模式下,您必须完全相同.(传递给应用层的字节数例如受OS中recv缓冲区大小的限制.)

send方法返回发送的字节数,告知它小于或等于传递的字符串的长度.如果要确保发送整个消息,则应执行与以下代码类似的操作:

def sendall(sock, data):
  while data:
    sent = sock.send(data)
    data = data[sent:]
Run Code Online (Sandbox Code Playgroud)

您可以直接使用sock.sendall,但是(根据文档)出错,会引发异常,并且无法确定成功发送了多少数据(如果有).

Python中的套接字遵循BSD套接字API,其行为方式与c风格的套接字类似(例如,不同之处在于它们抛出异常而不是返回错误代码).您应该对Web和联机帮助页上的任何套接字教程感到满意.