【问题标题】:How to get handle on addr of client which lost connection?如何处理丢失连接的客户端地址?
【发布时间】:2018-06-12 08:14:41
【问题描述】:

我有一个使用文档中的模板实现的 UDP 服务器,可以在这里找到:https://docs.python.org/3/library/asyncio-protocol.html#udp-echo-server-protocol

我想知道丢失连接的客户端的地址。 connection_lost 回调只有一个参数,exc 表示异常。

编辑:在否决票之后,我想强调它不是模块中对数据报 ServerProtocol 类“connection_made”中的回调命名非常友好的部分。

【问题讨论】:

  • UDP 中没有连接这样的东西,所以也不会发生连接丢失的事件。
  • 原谅我,但是为什么会有一个叫'connection_made'的回调呢?
  • 我同意您编辑中的评论。它不是。它的记录也很差。

标签: udp python-asyncio


【解决方案1】:

Python API 设计人员需要正确记录这一点。

看起来connection_made() 在您创建套接字时被调用并连接它which in turn only happens if you specify a non-None Remote_addr

要了解这一切,首先您需要了解connect() 在伯克利套接字 API 级别对 UDP 套接字做了什么:

  1. 它调节套接字以便write() andsend()can be used as well assendto()`,这两者都只会发送到连接的目标地址。
  2. 它调节套接字以过滤掉所有不是源自连接目标的数据报。
  3. 它确实创建任何类型的有线连接。对等方不会收到任何内容,也不会以任何方式通过网络发送任何内容。
  4. 您可以多次 connect() 一个 UDP 套接字,可以使用不同的地址或 null,这完全撤消了 (1) 和 (2)。

所以,我只能想象当 (4) 发生时会调用 connection_lost() 回调,但它不在您的代码中。

无论它做什么,如果有的话,它肯定不能用于检测客户端何时断开连接,因为 UDP 中没有这样的事件。

【讨论】:

  • 注意:我不是 Python 人,也没有测试过这些。我在这里是根据第一原则推理的。
  • connection_made is invoked 不管connect() 是否在 C 套接字 API 级别调用。 (如果未提供remote_addr,则该构造函数中的address 将为None。)这可能是因为connection_made 是异步“协议”连接到“传输”的方式。 connection_lost 显然在传输 is closed 时被调用。
猜你喜欢
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
相关资源
最近更新 更多