Можно ли «реле» сокет? - PullRequest
1 голос
/ 15 июля 2011

Мне было интересно, возможно ли передавать объект сокета в C # или Java?(Предпочтительно C #)

У меня есть много небольших программ, которые я делаю и размещаю их на своем домашнем компьютере, но мой компьютер находится за маршрутизатором, поэтому мне приходится переадресовывать порт на моем маршрутизаторе каждый раз, когда я хочу сделатьновое приложение.Так есть ли способ отправить TCP-соединение с другим приложением на том же компьютере?например, я получаю соединение с первой строкой текста RELAY::21005, которая затем перенаправляет этот порт на localhost:21005?

. Любая помощь, учебные пособия, фрагменты кода будут высоко оценены.Спасибо!:)

Ответы [ 5 ]

1 голос
/ 15 июля 2011

Одна из проблем, с которой вы можете столкнуться при использовании предлагаемого решения (первая строка определяет целевой порт), заключается в том, что вам придется изменить все клиентские программы для отправки этой первой строки. Это легко для программ, которые вы написали сами, но не очень удобно, если вы хотите подключиться к веб-серверу вашего ПК или демону ssh и т. Д. Конечно, это не невозможно, но все же это сложно.

Я бы посоветовал вашему серверу маршрутизации прослушивать два порта - порт управления и «нормальный» порт (в данный момент я не могу придумать лучшего имени). Вы бы отправляли управляющие сообщения на порт управления, чтобы указать «до дальнейшего уведомления перенаправить все входящие соединения на обычном порту на порт nnnn». Это избавляет от необходимости манипулировать клиентскими протоколами.

Я не знаю достаточно C #, чтобы дать совет о решении C #, но в Java я бы просто сделал что-то вроде:

while (true) {
    acceptConnectionOnNormalPort()
    connectToTargetPort()
    startThreadCopyingDataFromAcceptedPortToTargetPort()
    startThreadCopyingDataFromTargetPortToAcceptedPort()
}

Вы не сможете легко масштабировать это на тысячи соединений ...

0 голосов
/ 28 июля 2011

Да, есть возможность ретранслировать розетку.Вы можете использовать TURN http://en.wikipedia.org/wiki/Traversal_Using_Relay_NAT

Некоторые из библиотеки / приложения TURN:

  • pjnath
  • turnserver.sourceforge.net
0 голосов
/ 15 июля 2011

Может захотеть проверить этот старый любимый: netcat

0 голосов
/ 15 июля 2011

Самый простой подход IMO - использовать ssh-туннелирование.Как я уже писал в своем комментарии, на SU много вопросов, которые покажут вам, как это сделать.

Но при условии, что вы хотите что-то запрограммировать ...

Вам понадобитсясоздать клиента и сервер.У клиента будут потоки, которые вызывают accept на любых локальных портах, которые вы хотите открыть.Когда соединение приходит к порту, вы создаете другой поток, который открывает соединение с сервером и постоянно отправляет данные по сети.

Программа сервера прослушивает один порт, который вы открываете в брандмауэре.Он ожидает подключения к этому порту, а когда он получает соединение, открывает соединение с указанным локальным портом.Затем он перетасовывает байты из одного в другой.

Единственная хитрость заключается в том, что вам нужно определить протокол для указания порта назначения в потоке клиент-сервер.Самый простой подход - записать двухбайтовое целое число в начале потока.

0 голосов
/ 15 июля 2011

K Я забираю свой комментарий, проверьте это:

http://msdn.microsoft.com/en-us/library/aa395195.aspx

Для этого требуется, чтобы служба общего доступа к порту работала (по умолчанию она отключена):

Служба общего доступа к портам Net.TCP доступна во всех операционных системах. которые поддерживают .NET Framework 3.0, но служба не включена по умолчанию.

Все это полезно только для вас, если вы пользуетесь услугами WCF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...