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