Здравствуйте
Есть задача сделать что-то типа прокси для двух TcpClient. Идея такая:
1) Где-то в windows службе два TcpListener`а будут слушать и принимать двух TcpClient`ов, по одному каждому
2) При получении нужно как-то копировать данные из одного TcpClienta в другой, как на чтение так и на запись. Как раз путем получения/записи данных от/в NetworkStream данных клиентов.
Правильный ли данных подход, если учесть, что эти два TcpClienta будут располагаться за NAT, а TcpListener`ы будут видны обоим? или я изобретаю велосипед и все можно сделать как-то проще?
Здравствуйте, alexsoff, Вы писали: A>Правильный ли данных подход, если учесть, что эти два TcpClienta будут располагаться за NAT, а TcpListener`ы будут видны обоим? или я изобретаю велосипед и все можно сделать как-то проще?
Пока непонятна задача, которую вы решаете. Начните с описания проблемы, а уже потом можно переходить к предполагамому решению.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
Описание проблемы, примерно такое.
Есть сервер (принимает и обрабатывает данные), который слушает TCP порт,но он может быть за NATом, т.е. прямой доступ к нему из вне будет невозможен. Хотелось бы создать что-то типа внешнего прокси, которое просто будет связывать клиент данного сервера (по протоколу клиент возможен только один) и сам сервер. Действие прокси будет основано к регистрации серверов и присвоению им динамического номера. Клиент же будет обращаться к прокси с запросом соединения по номеру, который был получен сервером в предыдущем шаге. (скажем пользователь будет запускать клиент с полученным из вне номером сервера)
Хотелось бы, чтобы обмен данными в прокси был осуществлен простым копированием последовательности байт из одного TcpClient(представляющий сервер) в другой TcpClient (представляющий клиента).
Псевдокод действия прокси:
TcpClient server = serverTcpListener.AcceptClient()
...
TcpClient client = clientTcpListener.AcceptClient();
//Вот здесь, как лучше осуществить взаимную передачу данных между server и client?
//1) Использовать NetworkStream.CopyTo ?
//2) Читать самостоятельно побайтно из первого и второго потока и направлять принятые байты в другой поток
Хотелось бы узнать, в правильном ли я направлении иду, или есть другие средства?
PS
Я понимаю, что задача отлично решается изменением протокола на очередь сообщений, однако код существует, и хотелось бы малой кровью сделать изменения в нем.
Здравствуйте, alexsoff, Вы писали:
A>Здравствуйте, Sinclair, Вы писали: A>Описание проблемы, примерно такое. A>Есть сервер (принимает и обрабатывает данные), который слушает TCP порт,но он может быть за NATом, т.е. прямой доступ к нему из вне будет невозможен. Хотелось бы создать что-то типа внешнего прокси, которое просто будет связывать клиент данного сервера (по протоколу клиент возможен только один) и сам сервер. Действие прокси будет основано к регистрации серверов и присвоению им динамического номера. Клиент же будет обращаться к прокси с запросом соединения по номеру, который был получен сервером в предыдущем шаге. (скажем пользователь будет запускать клиент с полученным из вне номером сервера) A>Хотелось бы, чтобы обмен данными в прокси был осуществлен простым копированием последовательности байт из одного TcpClient(представляющий сервер) в другой TcpClient (представляющий клиента). A>Псевдокод действия прокси:
A>
A> TcpClient server = serverTcpListener.AcceptClient()
A> ...
A> TcpClient client = clientTcpListener.AcceptClient();
A> //Вот здесь, как лучше осуществить взаимную передачу данных между server и client?
A> //1) Использовать NetworkStream.CopyTo ?
A> //2) Читать самостоятельно побайтно из первого и второго потока и направлять принятые байты в другой поток
A>
A>Хотелось бы узнать, в правильном ли я направлении иду, или есть другие средства?
A>PS A>Я понимаю, что задача отлично решается изменением протокола на очередь сообщений, однако код существует, и хотелось бы малой кровью сделать изменения в нем.
Не понял, о чем вы, но решение пробросить порты — не подходит?
Здравствуйте, xednay89, Вы писали:
X>Не понял, о чем вы, но решение пробросить порты — не подходит?
К сожалению нет. Не всегда будет возможно, т.к. доступ к администрированию сети, где будут запускаться программы-серверы у нас не будет
Здравствуйте, alexsoff, Вы писали: A>Есть сервер (принимает и обрабатывает данные), который слушает TCP порт,но он может быть за NATом, т.е. прямой доступ к нему из вне будет невозможен.
Это очень популярная проблема. Вам приходило в голову поискать какие-то стандартные решения этого вопроса?
Например, http://en.wikipedia.org/wiki/Internet_Gateway_Device_Protocol
A>Хотелось бы создать что-то типа внешнего прокси, которое просто будет связывать клиент данного сервера (по протоколу клиент возможен только один) и сам сервер.
Я правильно понимаю, что ваш "внешний прокси" будет находиться под вашим управлением, и будет опубликован под публичным IP-адресом?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Это очень популярная проблема. Вам приходило в голову поискать какие-то стандартные решения этого вопроса?
Конечно, но я не знал keywords с которыми можно подступиться к гуглу
Нашел! http://managedupnp.codeplex.com/
Теперь, чтобы случилось чудо, можно просто пробросить порт через протокол UPnP.
Благодарю