У меня есть приложение в стиле клиент / сервер, которое общается с помощью 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 для этой работы? Какие есть альтернативы, если нет, и насколько легко было бы их реализовать.
Помните, что у нас нет прямого доступа к конфигурации брандмауэра, и изменение может занять несколько недель.