【问题标题】:Is Python socket.send limited in size? [closed]Python socket.send 的大小是否有限制? [关闭]
【发布时间】:2022-01-25 17:17:18
【问题描述】:

我有一个bytearray。我用len 检查了它的大小,它是 15.000 字节。但是,当通过s.send()(其中s 是一个套接字)发送时,只发送了6000 个字节。

这正常吗?对send 的下一次调用甚至不会发送其余的。

更多细节:即使使用 3 sendall 的 splittig 也不起作用:

s.sendall(fbytes[:5000])
s.sendall(fbytes[5000:10000])
s.sendall(fbytes[10000:])

【问题讨论】:

  • "下一次对send 的调用甚至不会发送其余的。"我们能看到那个代码吗?
  • 我会让有经验的人回答这个问题,但考虑到socket.send() 的文档特别提到应用程序负责发送所有数据,这可能是预期的行为。也许他们包含的HOWTO guide 可能会有所帮助?
  • @DanielWalker 代码太长而且很复杂,但是下一次调用 send 实际上会发送一个 10 字节的数组,例如 s.send(barr) 其中 barr 非常小
  • 这个问题需要足够的代码来描述问题。它目前仅显示 OP 的解释,这种解释可能不够准确。甚至不清楚是使用 TCP 还是 UDP,尽管这在回答问题时会有所不同。也不清楚接收端是如何工作的,即错误可能(也)在那里。
  • @AaaBbb “代码太长太复杂”。然后将代码减少到仍然存在相同问题的minimal reproducible example 并发布。没有看到一些代码,我们只能猜测。您在下面评论 .sendall() 是“不工作”,但它应该,所以向我们展示您在客户端和服务器上都在做什么。

标签: python sockets


【解决方案1】:

是的,这很正常。内核保留的套接字缓冲区只有这么大。您可以设置一个循环:

while data:
    transmitted = s.send(data)
    data = data[transmitted:]

或致电s.sendall(data),这实际上是为您服务。

【讨论】:

  • 可惜sendall不行,对方还是只收到6014字节
  • 也试过循环,还是一样的问题
  • 发送代码是否阻塞?
  • 不,它没有,“传输”值是完整大小(14000字节)。也许问题出在不使用python的接收端
  • 有可能。
【解决方案2】:

如果你想接收比限制更多的字节,你的 Python 文件中应该有以下代码。

client.recv(1024)

在上面的例子中,1024 是从客户端读取的字节数。
如果您想要更多字节,可以执行以下操作。

bytes_to_recv = 2000
client.recv(bytes_to_recv)

【讨论】:

  • @DanielWalker 好的,我会更新我的答案
  • @DanielWalker 是的,它确实需要一个作为 int 类实例的参数。这只是一个示例,因此请将“某物”替换为自定义整数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
  • 2018-06-24
  • 1970-01-01
  • 2013-12-13
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多