【问题标题】:Python3 socket.recv without ackingPython3 socket.recv 没有确认
【发布时间】:2021-01-10 00:22:55
【问题描述】:

我的 python 程序正在与一个设备对话,每次它收到一个对 push/ack 的 ack 时,都会将对话延迟一整秒。对话有数百条消息,甚至数千条消息,所以我自然想要解决这个问题。

有没有办法打开与我的设备的连接,保持打开状态以发送给它,但不确认我通过 socket.recv() 收到的消息?

import socket

s = socket.socket()
s.bind(('', xxxxx))
s.connect(('x.x.x.x', xxxxx))

while True:
    try:
        msg = input()
        if 'exit' in msg:
            data = b'I am done now, bye'
            s.send(data)
            data = s.recv(2048)
            print('recieved final message: ' + str(data))
            break
        msg = msg.encode()
        s.send(msg)
        print('sent message: ' + str(msg))
        data = s.recv(2048)
        print('received message: ' + str(data))
        print()
        data = ''
    except Exception as e:
        print(e)

s.close()

【问题讨论】:

  • 如果另一端没有发送 >= 2048 字节,那么您依赖于套接字超时,这会使一切变得相当缓慢。使用socket.getdefaulttimeout() 查找您的(特定于实现的)套接字默认超时 - 也许是一秒?您可以缩短它,这很可能会加快速度。建议您阅读并理解标题“使用套接字”下方的描述docs.python.org/3/howto/sockets.html
  • 另请阅读套接字文档docs.python.org/3/library/socket.html
  • 能不能不修设备?
  • @barny 我认为 s.recv(2048) 至少接收 1 到最多 2048 个字节并立即返回,除非没有可用的字节?
  • @barny 默认情况下,它会一直等待?

标签: python sockets tcp recv ack


【解决方案1】:

收到数据时必须发送ACK。否则,发送者将简单地假设数据没有被接收并尝试重新发送数据。这将基本上停止通信,因为只有一个(最初很小的)未确认数据窗口是可接受的。因此,创建这样的连接是没有意义的,这就是为什么没有办法做到这一点。

【讨论】:

  • 我知道它不是标准的,但是我可以用 socket.accept 建立连接并只是推送/确认而不用确认,但是当我建立套接字连接时,我只是没有选择。您可能是对的,我已经做了一些研究,到目前为止,我最大的希望是使用选择器而不是阻塞端口,因为我根据事件重新分配它用于发送和接收。
猜你喜欢
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
相关资源
最近更新 更多