Передача TCP-соединения на другой компьютер в качестве параметра - PullRequest
1 голос
/ 04 сентября 2011

Я пытался узнать протокол TCP.поэтому я могу передавать данные между двумя компьютерами в одной сети следующим образом:

\\the server:

var server = new TcpListener(ipAddress, port); //create a server
server.Start(); //start the server

//wait here until a client get's connected to this computer
TcpClient someClient = server.AcceptTcpClient();

NetworkStream stream = someClient.GetStream(); \\create a network stream object in order to read and send data to the other connected computer

после запуска сервера клиентское приложение сможет подключаться к серверу как:

//Client:
var client = new TcpClient(serverIP, port);
NetworkStream stream = client.GetStream();
//initialize data to by some byte array. the data you wish to send
stream.Write(data, 0, data.Length);



byte[] bytes = new bytes[1000] //instantiate a byte array
connection.stream.Read(bytes, 0, bytes.Length)  // wait here until data is send 

// in this line data has been received and it will be placed the bytes array

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

enter image description here

Надеюсь, эта картина поможет мне объяснить, что я имею в виду.

Установить соединение между компьютером A и C:

Если я хочу установить соединение между компьютером A и C, то это, вероятно, будет самым простым случаем.Другими словами, мне не нужно будет выполнять какую-либо переадресацию портов, чтобы установить соединение.

Установить соединение между компьютером A и сервером S:

, если клиентский компьютер оказывается компьютеромА и серверный компьютер окажется компьютером S, тогда компьютер А сможет найти сервер S. Так что это соединение также должно быть простым.

Установить соединение между компьютером А и компьютером Б: (вот моя проблема)

Так что, если компьютер A хочет найти компьютер B, маршрутизатор Y должен будет перенаправить весь трафик с порта 'somePort P' на компьютер B, и A должен будет предоставить IP-адрес маршрутизатора Y или IP-адрес WAN,

До этого момента мой заглавный вопрос не должен иметь смысла, позвольте мне объяснить, что я имею в виду, когда говорю «Передача tcp-соединения на другой компьютер»

Мне действительно нужно установить соединение между компьютером A икомпьютер B без необходимости настройки маршрутизаторов.Я много думал и думаю, что это возможно: (хотя это немного сумасшествие)

Если вы помните из моего предыдущего кода, как только соединение было установлено, все, что было отправлено / записано через сетевой поток,получен другим концом соединения.поэтому, поскольку компьютер A не может подключиться к компьютеру B, подключите A к серверу S. До сих пор существует соединение между компьютером A и сервером S. Итак, теперь установим TCP-соединение между компьютером B и сервером S.Сервер S должен иметь два разных соединения tcp, одно с компьютером A, а другое с компьютером B.

Поскольку сервер имеет два разных соединения tcp, у него также должны быть два объекта NetworkStream.допустим, что tcp-соединение между сервером S и компьютером A имеет объект NetworkStream streamA;, а tcp-соединение с компьютером B имеет объект NetworkStream streamB;

Так что здесь возникает сумасшедшая часть.Сервер S сериализует созданный и работающий объект streamB и отправляет этот объект на компьютер A. Затем компьютер A десериализует этот объект и преобразует его в объект NetworkStream.Компьютер A теперь должен иметь копию объекта streamB.ЧТО ПРОИЗОЙДЕТ, ЕСЛИ ВЫ ОТПРАВЛЯЕТЕ ДАННЫЕ ЧЕРЕЗ ЭТОТ ПОТОК !?теоретически компьютер B должен получить данные, которые я думаю.Я имею в виду, может быть, мне придется изменить информацию каждого заголовка пакета, чтобы маршрутизатор Y обрабатывал эти пакеты так, как если бы они были получены с сервера S!

. Причина, по которой я хочу это сделать, заключается в том, что я создал приложение сервераи клиентское приложение, где оно будет синхронизировать файлы между двумя компьютерами в определенной папке.Часто пользователи этой программы не знают, как включить переадресацию портов.Я также знаю, что смогу решить эту проблему с помощью так называемого tcp puch holing, но я не смог найти работающий метод на c # ....

Ответы [ 2 ]

3 голосов
/ 04 сентября 2011

Попытка отправки потоков или соединений через соединения сродни попытке отправки телефона по телефонной линии. Это то, что философы называют категориальной ошибкой. Вы не можете сделать это. Поток - это аспект сокета, а сокет - это конечная точка существующего соединения. Период. Его нельзя никуда отправить.

2 голосов
/ 04 сентября 2011

Метод, который вы предложили, не будет работать.A и B оба посылают трафик на S. Независимо от того, что S посылает на A или B, у A и B все еще будут маршрутизаторы (X и Y), передающие трафик только к S. Как вы уже сказали, вы хотите, чтобы NAT дыраpunching.

Основная идея дырок в NAT заключается в том, чтобы A отправлял трафик на B, а B отправлял трафик на A одновременно.Если все сделано правильно, каждый маршрутизатор (X и Y) будет думать, что пакет с другой стороны является ответом на пакет, который он отправил, и они установят записи NAT, позволяющие A и B напрямую общаться друг с другом.Это почти невозможно сделать для TCP, но можно сделать для UDP .

...