Я пытался узнать протокол 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 оказались в одной сети:
Надеюсь, эта картина поможет мне объяснить, что я имею в виду.
Установить соединение между компьютером 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 # ....