Удаленное соединение через TCP - PullRequest
0 голосов
/ 05 апреля 2009

У меня есть удаленный сервер и встроенный клиент. Сервер настроен так:

BinaryServerFormatterSinkProvider serverProv = 
    new BinaryServerFormatterSinkProvider();
serverProv.TypeFilterLevel = TypeFilterLevel.Full;
BinaryClientFormatterSinkProvider clientProv = 
    new BinaryClientFormatterSinkProvider();

IDictionary props = new Hashtable();
props["port"] = port;

TcpChannel channel = new TcpChannel( props, clientProv, serverProv );

ChannelServices.RegisterChannel( channel, false );

RemotingConfiguration.RegisterWellKnownServiceType( typeof( Controller ),
    "Controller", WellKnownObjectMode.Singleton );

Клиент настроен так:

ChannelServices.RegisterChannel( new TcpChannel( 0 ), false );
m_Controller = (Controller)RemotingServices.Connect( typeof( Controller ), 
      "tcp://" + ip + ":2594/Controller" );

Когда я пытаюсь подключиться к серверу с того же компьютера с IP-адресом, указанным как «localhost», он подключается нормально. Однако, когда я пытаюсь подключиться с удаленного компьютера, а не из локальной сети, учитывая IP-адрес сервера, я получаю следующее исключение на клиенте после длительного ожидания:

A connection attempt failed because the connected party did not properly
respond after a period of time

Как я могу решить это? Я уверен, что это проблема конфигурации, потому что порты правильно перенаправлены на сервер, а брандмауэр не активен.

Спасибо

Ответы [ 4 ]

0 голосов
/ 08 марта 2011
0 голосов
/ 06 апреля 2009

В командной строке (cmd.exe) запустите netstat -a на стороне сервера и посмотрите только строки LISTENING. Должен быть один, показывающий порт, на котором работает ваш сервер, в виде числа после двоеточия в столбце «Локальный адрес»:

>netstat -a
...
Proto  Local Address          Foreign Address        State
TCP    0.0.0.0:135            Blah:0                LISTENING
TCP    127.0.0.1:136          Blah:0                LISTENING

Если локальный адрес отображается как 127.0.0.1, это означает, что ваше серверное приложение прослушивает только петлевой адаптер. Этот адаптер допускает только соединения с локальной машины обратно к себе (отсюда и название), поэтому удаленные соединения с такими портами не будут приняты. Обратите внимание, что имя 'localhost' является именем для 127.0.0.1, поэтому, если вы указали это где-нибудь, это может быть объяснением. (136 в приведенном выше примере показывает гнездо обратной связи прослушивания.)

Если Локальный адрес отображается как 0.0.0.0, это означает, что ваше серверное приложение прослушивает все адаптеры и (при условии, что у вас есть сетевой адаптер, который, как я предполагаю, у вас есть) будут приняты удаленные подключения. (135 в приведенном выше примере.)

В последнем случае, если локальный адрес - это другой IP-адрес, тогда ваше серверное приложение прослушивает определенный сетевой адаптер. Если у вас есть несколько адаптеров, возможно, он прослушивает не тот.

Теперь, после всего сказанного, у меня есть небольшое приложение с кодом, который вы разместили, и кажется, что по умолчанию прослушивается 0.0.0.0 (все адаптеры), поэтому я был бы удивлен, если вы увидите что-то еще. Если вы видите 0.0.0.0, то мой следующий порт захода будет состоять в том, чтобы посмотреть на брандмауэры как на клиенте, так и на сервере, как локальном, так и корпоративном, если вы находитесь в организации.

Если у вас есть консольный доступ к удаленному компьютеру, вы можете попытаться подключиться к локальному компьютеру через этот порт, чтобы узнать, действительно ли он прослушивает соединения. Я также хотел бы заменить на сервере простой прослушиватель TCP, например Netcat, чтобы проверить, не связана ли проблема с вашим приложением или инфраструктурой.

0 голосов
/ 05 мая 2009

Этому вопросу месяц, но тем не менее:

Отслеживание трафика на сервере (и, предпочтительно, на клиенте) должно дать вам более полное представление о том, что происходит.

Для работы я рекомендую Packetyzer , очень удобный анализатор пакетов для Windows.

0 голосов
/ 06 апреля 2009

Похоже, сервер не активирован. При использовании localhost, как вы запустили сервер? Вы сделали то же самое, используя удаленный IP-адрес?

...