Можно ли перенаправить открытое TCP-соединение на третье устройство?
Например, у меня есть два клиента, которые оба подключены к центральному серверу. Оба инициировали общение. Они не могут принимать какие-либо подключения извне, потому что межсетевой экран маршрутизатора блокирует их.
Что если они захотят соединиться друг с другом: можно ли перенаправить два соединения с сервером, чтобы они стали одним одноранговым соединением между клиентами? (У меня такое ощущение, что это невозможно) Моя программа позволяет обоим устройствам работать как TCP-сервер, их блокируют только брандмауэры.
В настоящее время я использую два решения для общения между двумя клиентами. Один использует сопоставления портов UPnP, другой — что сообщения, отправленные на сервер, повторяются и передаются клиентам.
Есть ли другое решение? Меня особенно интересуют методы, которые используют C ++, Qt и Linux.
Вы не можете перенаправить уже открытые TCP-соединения на другое устройство, потому что в этом случае конечные точки соединения должны будут измениться, но конечная точка (порт ip +) является важной частью соединения. Таким образом, вы можете передавать только те данные, которые вы получили на сервере, с одного соединения на другое и обратно, или вы можете попытаться заставить обе стороны подключиться напрямую друг к другу с самого начала, пробивая дыры в TCP, как уже упоминалось в комментарии. Но это будет работать только для простых настроек NAT.
Простая переадресация портов на сервере не будет работать для уже установленных соединений, поскольку вам придется переписывать не только отправителя и получателя всех пакетов (например, NAT), но также переписывать порядковые номера и т. Д., Чтобы они соответствовали другому установленному соединению. Таким образом, вам необходимо выполнить пересылку в пользовательском пространстве или внутри ядра на уровне соединения, а не на уровне пакетов, используя такие методы, как сплайсинг сокетов.