Вопрос

есть ли какой-нибудь способ поставить пакеты в очередь на сокет в Python?Я искал что-то вроде libipq библиотека, но не могу найти ничего эквивалентного.

Вот чего я пытаюсь добиться:

  1. Создайте tcp-сокет-соединение между сервером и клиентом (оба находятся под моим контролем).
  2. Попробуйте передать данные (ожидая подключения к неисправности - напримерклиент теряет подключение из-за выключения ноутбука)
  3. Поймать SocketException и удерживайте данные, которые пытались быть отправлены, сохраняя при этом оставшиеся ожидающие данные (в очереди?)
  4. Войдите в цикл, пытаясь восстановить соединение (предполагая, что успех неизбежен)
  5. Создайте новый сокет после успешного завершения
  6. Возобновить передачу данных

Есть какие-нибудь предложения?Может ли Twisted это сделать?Нужно ли мне привлекать pcapy?Должен ли я сделать это (сокеты, очереди и т.д.) На C и использовать Boost для создания гибридного кода?

Заранее благодарю.


Правка 1:

Ответ на Ник:

Я упустил тот факт, что данные я передатчик будет обобщено и нескончаема ... думаю этого приложения сидя под сеанс SSH (я не в любом случае, пытаясь заглянуть в пакеты).Таким образом, передача будет двусторонней.Я хочу иметь возможность приходить из офиса домой (закрывая ноутбук в промежутках), открывать ноутбук дома и беспрепятственно продолжать сеанс .(Я знаю, что ЭКРАН существует).Это может навести вас на мысль, как бы это работало без прокси.Этого не произойдет, я просто не объяснил этот дизайн.Цитата из блока

Учитывая добавленный контекст, я должен также сказать, что мне не придется ловить SocketException на стороне сервера, поскольку эта машина будет исправлена (или предполагается, что она исправлена).Когда клиент поймет, что у него снова есть подключение, он просто повторно подключится к серверу.

Это было полезно?

Решение

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

Затем сервер запоминает, какой серийный номер нужен клиенту следующим, и отправляет его.Если соединение прерывается, сервер восстанавливает его заново.

Данные могут быть буферизованы в любом случае, как вам нравится, но я бы сделал это простым для начала и использовал деке вероятно, это немного эффективнее, чем list для получения данных о начале и конце.

Я бы, вероятно, создал объект Packet, который имеет атрибут serial number и способ сериализации и несериализации его и его данных в поток байтов (например, с помощью сетевые нити).Затем вы сохранили бы эти Пакеты в своем deque.Вы бы извлекали пакет из deque и всякий раз, когда получали подтверждение от клиента, отправляли следующий.

Такие протоколы имеют множество угловых ситуаций, необходимых тайм-аутов и, как правило, раздражают при отладке.Посмотрите как-нибудь на исходный код SMTP-сервера, если вам захочется получить какую-нибудь идею!

Что касается сокетов, вы могли бы легко реализовать это с помощью обычных сокетов python и посмотреть, как это работает.Если вы планируете иметь много клиентов одновременно, то twisted будет хорошей идеей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top