Как получить ссылку на адрес клиента, который потерял соединение? - PullRequest
0 голосов
/ 12 июня 2018

У меня есть UDP-сервер, реализованный с использованием шаблона в документации, которую можно найти здесь: https://docs.python.org/3/library/asyncio-protocol.html#udp-echo-server-protocol

Я хотел бы знать адрес клиента, потерявшего соединение.Обратный вызов connection_lost имеет только один параметр, exc для исключения.

Редактировать: После отрицательных голосов, я хочу подчеркнуть, что это не очень дружественная для нубов часть модуля, называющая обратный вызов в классе дейтаграмм ServerProtocol 'connection_made'.

1 Ответ

0 голосов
/ 13 июня 2018

Разработчики Python API должны правильно документировать это.

Похоже, connection_made() вызывается, когда вы создаете сокет и подключаете его , , что в свою очередь происходит толькоесли вы укажете не None Remote_addr.

Чтобы понять все это, сначала вам нужно понять, что connect() делает с сокетом UDP на уровне API сокетов Беркли:

  1. Условие сокета так, что write() and send () can be used as well as sendto () `, оба из которых будут отправлять только на подключенный целевой адрес.
  2. Условие сокетаотфильтровывать все дейтаграммы, которые не были получены от цели соединения.
  3. Это не создает проводное соединение любого вида.Ничто не принимается одноранговым узлом и не отправляется по проводам каким-либо образом.
  4. Вы можете connect() сокет UDP несколько раз, либо на другой адрес, либо на ноль, что полностью отменяет (1) и (2).).

Итак, я могу только представить, что обратный вызов connection_lost() вызывается, когда (4) происходит, чего нет в вашем коде.

Что бы это ни делало,во всяком случае, он, безусловно, не может быть использован для обнаружения, когда клиент отключается, поскольку в UDP такого события нет.

...