Мне нужно отправить файл пользователю за маршрутизатором. Я знаю, что могу сделать это с TCP-соединением, если он включит переадресацию портов на своем маршрутизаторе. Я хочу избежать этого, чтобы упростить использование моего приложения для моих пользователей. Итак, я пытался сделать tcp перфорацию, и это почти невозможно. Мне удалось сделать udp puch Holing.
если вы уже знаете, что такое перфорация udp, то можете пропустить эту часть:
Итак, что я сделал, чтобы установить соединение между двумя пользователями, которые оказались за маршрутизатором. пользователь 1 разговаривает с сервером, имеющим IP-адрес WAN, по протоколу udp. пользователь 2 также делает то же самое. Итак, теперь сервер знает удаленную конечную точку каждого пользователя. теперь сервер отправляет пользователю 2 информацию о пользователе 1. сервер уведомляет пользователя 1 о том, что пользователь 2 получил информацию. Затем пользователь 2 отправляет пакеты на IP-адрес маршрутизатора пользователя 1. Пакеты, полученные этим маршрутизатором, перенаправляются пользователю 1, поскольку они поступают с порта, указанного сервером. поэтому знайте, что все пакеты, которые пользователь 2 отправляет на маршрутизатор пользователя 1, попадут к пользователю 1, если они будут отправлены через порт, указанный сервером. когда пакеты прибывают к пользователю 1, эти пакеты прибывают с информацией о пользователе 2. Пользователь 1 теперь также знает, как отправлять данные двум пользователям 2.
Итак, теперь я могу отправлять данные между двумя пользователями, которые находятся за разными маршрутизаторами. Причина, по которой я использовал протокол udp, заключалась в том, что он похож на tcp при использовании c#. Я пытался сделать это с помощью tcp, но я просто не могу заставить его работать. это приложение, которое я создаю, написано на С#, и все отлично работает, когда пользователи находятся за одним и тем же маршрутизатором. но знаю, что я хочу расширить функциональность.
Итак, теперь я, наконец, сделал свой первый шаг по подключению двух клиентов за другим физ. единственная проблема в том, что мне удалось это сделать только с помощью протокола upd. Я читал, что upd не гарантирует доставку данных, а также что данные могут быть получены в другом порядке.
Может быть, я могу создать алгоритм, чтобы иметь возможность отправлять данные через udp, зная, что данные не будут потеряны.
другой альтернативой является использование другого протокола, такого как ftp, bittorrent... и т. д. Однако я не знаю, можно ли будет сделать перфорацию ftp.
Короче говоря, я просто хочу, чтобы два одноранговых узла, находящихся за разными маршрутизаторами, могли общаться с помощью сервера. Я не хочу общаться через рейлинг (соединение идет от клиента А к серверу к клиенту Б), потому что иногда им сложно управлять и дорого поддерживать, когда его использует много пользователей. Возможно, мне следует использовать другой протокол, такой как библиотека BitTorrent, но я этого не сделал, потому что не нашел в Интернете хорошего примера, показывающего, как использовать эту библиотеку.