【问题标题】:python socket: sending and receiving 16 bytespython socket:发送和接收16个字节
【发布时间】:2011-07-26 17:11:30
【问题描述】:

请参阅下面的编辑。

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

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 字节的块,接收器报告大小为 7973930。

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

还有其他问题吗?

Python 2.7 或 2.5.4 如果重要的话。

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

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

我将开始另一个关于如何更好地做到这一点的问题。

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

【问题讨论】:

  • 你没有说你正在使用什么协议。是 TCP 还是 UDP?
  • “我发送了一个 7973903 字节的块”。你怎么会知道这事? “接收器报告大小为 7973930” 如果这是前 16 个字节,那么这就是实际大小。为什么你认为大小不是接收者收到的前 16 个字节的大小?请提供一些日志或其他信息以显示发生了什么。
  • 查看最新编辑。我在每一端都有打印语句。我收到第一个 recv 的数字,然后是循环的数据。
  • "我发送号码 7973903,接收方读取号码为 7973930。"请包括您实际执行的实际日志输出以证实这一点。另外,在接收器上读取大小时,使用repr() 函数打印字符串,然后再应用int()。
  • 仅供参考,如果您找到了答案,那么您应该在自己的问题上发布您的答案并接受它,这样就不会再将其标记为未回答 :-)

标签: python sockets


【解决方案1】:

首先是行

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() 倒计时,要求越来越小的限制,直到它最终收到所承诺的字节数,仅此而已。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 2016-01-30
    • 1970-01-01
    相关资源
    最近更新 更多