Добрый день!
Есть приложение на .Net Remoting. При подключении к серверу из внутренней подсети все ок, при попытке зайти через внешний IP (который каким то образом форвардиться на внутренний адрес) получаю Exception
Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение 10.0.0.10:54099, что вобщем то логично, т.к. 10.0.0.10 — это шлюз
Делал как тут
, но что то не выходит каменный цветок.
Насколько я понимаю, мне нужно передать на сервер IP клиента, но где в серверной части нужно производить замену обратного адреса?
Свой код пока не выкладываю(если нужно выложу), т.к. простыня длинная и практически полностью совпадает с кодом по ссылке
Здравствуйте, Kostya33, Вы писали:
K> При подключении к серверу из внутренней подсети все ок, при попытке зайти через внешний IP (который каким то образом форвардиться на внутренний адрес) получаю Exception K>Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение 10.0.0.10:54099, что вобщем то логично, т.к. 10.0.0.10 — это шлюз
Извне как происходит подключение ? На какой IP?
Вообще форвардинг обычно настраивается в виде
Внешний порт -> Внутренний IP : Внутренний порт
Номера портов внешнего и внутреннего могут совпадать (но необязательно).
Можно также начать с проверки доступности порта (т.е. настройки форвардинга и файерволлов)
telnet IP порт
Здравствуйте, andrey82, Вы писали:
A>Здравствуйте, Kostya33, Вы писали:
K>> При подключении к серверу из внутренней подсети все ок, при попытке зайти через внешний IP (который каким то образом форвардиться на внутренний адрес) получаю Exception K>>Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение 10.0.0.10:54099, что вобщем то логично, т.к. 10.0.0.10 — это шлюз
A>Извне как происходит подключение ? На какой IP? A>Вообще форвардинг обычно настраивается в виде A>Внешний порт -> Внутренний IP : Внутренний порт A>Номера портов внешнего и внутреннего могут совпадать (но необязательно). A>Можно также начать с проверки доступности порта (т.е. настройки форвардинга и файерволлов) A>telnet IP порт
Извне приходит на интернетовский IP
Форвардинг примерно так и настроен
Телнетом можно подключиться из интернета и посмотреть на .Net овский exception (который от пустого запроса)
После того как клиент отправляет запрос на сервер, на сервере происходит активация объекта, я могу прочитать header'ы из своей реализации IServerChannelSink
После этого вызывается мой ITrackingHandler
Тут все ОК.
После этого сервер пытается установить обратное соединение, но вместо IP адреса клиента, ломиться на шлюз, и возникает ошибка.
Т.е. где-то в сервере нужно указать IP клиента, что бы сервер открывал обратное соединение туда
Здравствуйте, Kostya33, Вы писали:
K>Насколько я понимаю, мне нужно передать на сервер IP клиента, но где в серверной части нужно производить замену обратного адреса?
На клиенте есть конфигурация, где указан IP-адрес сервера. Подмените IP-адрес в биндинге на клиенте для начала.
Здравствуйте, Nikolay_Ch, Вы писали:
N_C>Здравствуйте, Kostya33, Вы писали:
K>>Насколько я понимаю, мне нужно передать на сервер IP клиента, но где в серверной части нужно производить замену обратного адреса? N_C>На клиенте есть конфигурация, где указан IP-адрес сервера. Подмените IP-адрес в биндинге на клиенте для начала.
Не совсем понял о какой конфигурации идет речь.
у меня соединение с сервером устанавливается так:
string uri = String.Format(@"tcp://{0}:{1}", ip, port);
RemotingConfiguration.RegisterActivatedClientType(typeof(ServerImpRemotingProxy), uri);
server = new ServerImpRemotingProxy();
ServerImpRemotingProxy — это объект который будет создан на стороне сервера. Слово Proxy пусть не смущает, это просто объект, который реализует мой интерфейс
Еще есть такой код
Он тоже работает, но в uri и так правильный адрес сервера, подменять там нечего
public class NmsIpClientSinkProvider : IClientChannelSinkProvider
{
private IClientChannelSinkProvider _nextProvider = null;
private string _serverHostNameOrIp;
public NmsIpClientSinkProvider(string hostNameorIp)
{
if (String.IsNullOrEmpty(hostNameorIp))
throw new ArgumentNullException("hostNameorIp == null");
_serverHostNameOrIp = hostNameorIp;
}
public IClientChannelSink CreateSink(IChannelSender channel, string url, object remoteChannelData)
{
if (!url.Contains(_serverHostNameOrIp))
{
string oldIp = url.Substring(6).Remove(url.LastIndexOf(':') - 6);
url = url.Replace(oldIp, _serverHostNameOrIp);
}
IClientChannelSink nextSink = _nextProvider.CreateSink(channel, url, remoteChannelData);
return (new NmsClientChannelSink(nextSink, _serverHostNameOrIp));
}
public IClientChannelSinkProvider Next
{
get { return _nextProvider; }
set { _nextProvider = value; }
}
}