1

我正在编写一个函数来从套接字读取并返回数据的确切大小。我想到了如下代码:

whlie len(buf) < required:
    buf += socket.recv(required - len(buf))

return buf

但我认为这可能会浪费一些 CPU 资源(不确定)。我正在寻找一个系统调用或其他东西来从套接字返回确切的数据量,并且它可能会被阻止,直到收到所需的大小。

4

3 回答 3

2

这不会浪费 CPU 资源。

sock.recv阻塞直到至少有一个字节可用(但如果它们可用,可能会缓冲并返回多个字节),因此您的应用程序不会进入繁忙循环。

一般来说,sock.recv调用的缓冲区长度不应该与您要检索的消息的长度有任何关系


但是,字符串连接对您的缓冲区效率不高。

您可能需要考虑使用:

  • 一个列表,和''.join()b''.join()如果使用 Python 3)
  • StringIOandcStringIO模块(或者如果使用io.BytesIOPython 3)。
  • 使用sock.recv_intoStringIO/ bytesIO
于 2013-07-07T03:06:48.133 回答
0

如果您使用的是默认套接字库,则可以使用以下内容。

import socket
host, port = "localhost", 8000
num_bytes  = 5000

sock = socket.socket()
sock.connect((host, port))
while True:
    data = sock.recv(num_bytes)
    handle(data)

您可以在这里查看可能的参数socket.recv 文档

于 2013-07-07T02:57:50.283 回答
0

请参阅我的 Python 2.x 套接字模块示例。使用memoryview()recv_into(),

def readReliably(s,n):
    buf = bytearray(n)
    view = memoryview(buf)
    sz = s.recv_into(view,n)
    return sz,buf

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
...
sz,buf = io.readReliably(s,4)
a = struct.unpack("4B",buf)
print repr(a)

返回的缓冲区的大小readReliably()可以大于n,不要忘记。

于 2019-03-31T23:16:21.633 回答