У меня проблемы с моим серверным приложением, написанным на Python3/asyncio (Protocol), но я уверен, что это не так много python или asyncio, потому что я пробовал другую версию и некоторые 5liner только с интерфейсом сокета. Речь идет о параллельной связи со многими устройствами для клиентов TCP/IP < -> Преобразователи RS232. Именно по этой причине используется asyncio, а не потоки с блокировкой write.Python: TCP сломанный маршрут мучительно медленный для обнаружения
Существует некоторая периодическая передача коротких данных. Проблема возникает, когда я физически разорвите соединение и ждать исключение происходит:
asyncio - Fatal read error on socket transport protocol
<_SelectorSocketTransport fd=11 read=polling write=<idle, bufsize=0>>
Traceback (most recent call last):
File "/usr/lib/python3.5/asyncio/selector_events.py", line 663, in
_read_ready
data = self._sock.recv(self.max_size)
OSError: [Errno 113] No route to host
это происходит, но после 15 минут, что означает, что я сигнализации в течение 15 минут все в порядке, но это ISN» t, который невыносимо длинный и нарушает функцию. Поведение проверено в Ubuntu 16.04, Ubuntu 14.04 и Debian Jessie, все в разных HW.
Я обнаружил, что (вероятно) ядро буферизует данные, потому что, если я заново подключу устройство через десять минут, все данные будут красными сразу. Я понимаю, что это хорошо для короткого разъединения, у меня не было бы проблем с 10, 15 или даже минутой, но 15 минут слишком много.
На подобный вопрос ответил исполнительный протокол приложения, что невозможно в моем случае. Я просто хочу быть уверенным, что другая сторона получит пакет (TCP ack) в разумные сроки. Я внимательно прочитал документы о socket.setsockopt
, но не нашел ничего полезного. Также не нашел способ проверить, был ли сброшен буфер отправки, чтобы сделать некоторые обходные пути - ручное обнаружение неисправного маршрута.
TCP keep-alive также не помогает, поскольку он основан на времени бездействия и отправке данных - это активность.