Как я могу привязать TCPListener к внешнему IP-адресу? - PullRequest
3 голосов
/ 10 июня 2009

У меня есть приложение в стиле клиент / сервер, которое общается с помощью WCF, и все это прекрасно работает. Одной из функций приложения является получение файлов с клиентских компьютеров на сервер (Central Control).

Central Control запрашивает список файлов в указанной папке на клиенте и открывает порт с помощью сокетов, чтобы клиенты могли подключаться к каждому файлу и передавать его в потоковом режиме. Для каждого файла используется другой номер порта.

Это работало нормально при локальном тестировании, но при развертывании в среде наших клиентов я получил следующее исключение.

The requested address is not valid in its context
   at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)
   at System.Net.Sockets.Socket.Bind(EndPoint localEP)
   at System.Net.Sockets.TcpListener.Start(Int32 backlog)
   at System.Net.Sockets.TcpListener.Start()
   at AMIGA.Library.TransferFile.listenerThread()

IP-адрес в конечной точке является адресом 10. . . *. Я погуглил на предмет ответа, и общее согласие состояло в том, что с tcpListener не может связываться с внешним IP-адресом. Я не думал, что адрес 10. . . * Был внешним.

Код, который выдает исключение, выглядит следующим образом:

tcpListener = New TcpListener(IEndPoint)
Dim handlerSocket As Socket
Dim thdHandler As Thread
tcpListener.Start()
RequestFile()

Нет ли способа использовать TcpListener для этой работы? Какие есть альтернативы, если нет, и насколько легко было бы их реализовать.

Помните, что у нас нет прямого доступа к конфигурации брандмауэра, и изменение может занять несколько недель.

Ответы [ 2 ]

2 голосов
/ 10 июня 2009

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

  1. Используйте команды UPnP (Universal Plug N Play) из вашего приложения к роутеру, чтобы открыть выбранное порт. UPnP не будет включен для более безопасные конфигурации брандмауэра.
  2. (более сложное) Использование TCP Hole штамповка , чтобы установить подключение через брандмауэр.
  3. Измените смысл, чтобы клиенты подключались к серверу. Сервер динамически открывает порт с помощью команды UPnP или просто имеет блок портов, открытый в брандмауэре для использования этим приложением.

    В любом случае убедитесь, что соединение WCF защищено безопасностью, чтобы никто другой не мог прийти через сканирование портов и получить доступ к файлам без авторизации.

0 голосов
/ 10 июня 2009

Это исключение обычно возникает, когда вы пытаетесь привязать адрес, который недопустим на компьютере. Назначен ли IP-адрес, к которому вы пытаетесь подключиться, одному из сетевых интерфейсов на машине?

...