Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Проблема потери данных протокола tcp в скрученном

Автор вопроса: ifocusОтветов: 1

Я написал сервер на основе TCP с модулем Twisted.Internet. Это среда с высокой степенью параллелизма.

Я обычно отправляю данные экземпляром protocol.Protocol, и у меня возникла проблема с этим. Некоторые tcp-соединения могут быть закрыты из-за тайм-аута, и, похоже, я не могу получить уведомление, так что данные, которые я записал в закрытом соединении, могут быть потеряны.

И проблема потери данных может быть вызвана каким-то другим образом.

Есть ли хороший способ контролировать это? (socket.send может возвращать состояние, у transport.write, похоже, нет возврата)

pythontcptwisted

Ответы

Ответ 1 · рейтинг 4 · Glyph

Эта проблема не характерна для Twisted. Ваш протокол должен иметь какое-то подтверждение того, что данные были получены, если вы хотите знать, что они были получены.

Результат send() не говорит о том, что данные были получены узлом авторитетно; он просто говорит, что ядро ​​поставило его в очередь для транспортировки. С точки зрения вашего приложения, действительно не имеет значения, были ли данные поставлены в очередь Twisted, или вашей средой выполнения C, или вашим ядром, или промежуточным нижестоящим коммутатором, или ядром партнера, или кем-то еще. Может отправили, может нет. Иными словами, transport.write() заботится о дополнительной буферизации, которой нет у send(), гарантируя, что он всегда буферизует все ваши байты, тогда как send() буферизует только некоторые из них.

Вам абсолютно необходимо иметь подтверждающее сообщение на уровне приложения, если вам небезразлично, видел ли одноранговый узел ваши данные или нет.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы