gpt4 book ai didi

python 套接字 : sending and receiving 16 bytes

转载 作者:太空宇宙 更新时间:2023-11-03 11:34:57 25 4
gpt4 key购买 nike

请参阅下面的修改。

我有两个通过套接字进行通信的程序。我正在尝试将数据 block 从一个发送到另一个。这一直在处理一些测试数据,但在处理其他数据时失败了。

s.sendall('%16d' % len(data))
s.sendall(data)
print(len(data))

发送给

size = int(s.recv(16))
recvd = ''
while size > len(recvd):
data = s.recv(1024)
if not data:
break
recvd += data
print(size, len(recvd))

一方面:

s = socket.socket()
s.connect((server_ip, port))

和另一个:

c = socket.socket()
c.bind(('', port))
c.listen(1)
s,a = c.accept()

在我最近的测试中,我发送了一个 7973903 字节的 block ,接收方报告大小为 7973930。

为什么接收到的数据 block 少了27个字节?

还有其他问题吗?

Python 2.7 或 2.5.4(如果重要的话)。

编辑:啊哈 - 我可能读完了发送缓冲区的末尾。如果剩余字节数小于1024,我应该只读取剩余字节数。这种数据传输是否有标准技术?我觉得我正在重新发明轮子。

EDIT2:我在阅读系列中的下一个文件时搞砸了。我正在发送 file1,最后一个 block 是 997 字节。然后我发送 file2,因此 file1 末尾的 recv(1024) 读取 file2 的前 27 个字节。

我将开始另一个关于如何做得更好的问题。

谢谢大家。询问和阅读评论帮助我集中注意力。

最佳答案

先行

size = int(s.recv(16))

可能读取不到 16 个字节——这不太可能,我承认,但可能取决于网络缓冲区的对齐方式。 recv() 调用参数是一个最大值 值,限制您愿意接收的数据量。但是您可能只收到一个字节。一旦至少一个字节到达,操作系统通常会把控制权还给你,也许(取决于操作系统和 CPU 的繁忙程度)再等几毫秒,以防第二个数据包到达时带有更多数据,这样它只需唤醒您一次而不是两次。

所以你会想说(做最简单的循环;其他变体也是可能的):

data = ''
while len(data) < 16:
more = s.recv(16 - len(data))
if not more:
raise EOFError()
data += more

这确实是一个几乎每个人都重新发明的轮子,因为它经常被需要。你自己的代码需要它第二次:你的 while 循环需要它的 recv() 来倒计时,要求越来越小的限制,直到它最终收到准确的数字 promise 的字节数,仅此而已。

关于 python 套接字 : sending and receiving 16 bytes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6833881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com