Я пытаюсь написать некоторый код Python, который установит невидимое реле между двумя сокетами TCP. Моя текущая техника состоит в том, чтобы настроить два потока, каждый из которых считывает и затем записывает 1 КБ данных за раз в определенном направлении (то есть 1 поток для A - B, 1 поток для B - A).
Это работает для некоторых приложений и протоколов, но не является надежным - иногда отдельные приложения будут работать по-разному при работе через этот ретранслятор на основе Python. Некоторые даже терпят крах.
Я думаю, это потому, что когда я заканчиваю чтение в сокете A, выполняющаяся там программа считает, что его данные уже поступили в B, тогда как на самом деле я - коварный человек посередине - еще не отправил его B. В ситуации, когда B не готов принять данные (из-за чего send()
блокируется некоторое время), мы сейчас находимся в состоянии, когда A считает, что он успешно отправил данные в B, но я все еще держу данные, ожидающие вызова send()
. Я думаю, что это является причиной различий в поведении, которое я обнаружил в некоторых приложениях при использовании моего текущего кода ретрансляции. Я что-то пропустил, или это звучит правильно?
Если так, то мой реальный вопрос: есть ли способ обойти эту проблему? Можно ли читать из сокета A только тогда, когда мы знаем, что B готов к приему данных? Или есть другой метод, который я могу использовать для установления действительно «невидимого» двустороннего реле между [уже открытыми и установленными] сокетами TCP?