2010-11-09 2 views
1

Для проекта, над которым мы работаем, мы используем удаленное взаимодействие .NET для связи между сервером и клиентом. До сих пор мы тестировали его на одной машине и ее работе, используя localhost и произвольный номер порта. Однако при тестировании между двумя компьютерами в одной и той же сети, используя основной компонент, работает, но прокси-объект выходит из строя.Ошибка сокета при удалении .NET между двумя машинами

Мы используем файлы конфигурации, чтобы задать имя сервера и порт, как это:

<setting name="ServerName" serializeAs="String"> 
    <value>192.168.1.141</value> 
</setting> 
<setting name="Port" serializeAs="String"> 
    <value>9932</value> 
</setting> 

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

_port = global::ConsoleClient.Properties.Settings.Default.Port; 
_servername = global::ConsoleClient.Properties.Settings.Default.ServerName; 

string url = "tcp://" + _servername + ":" + _port + "/Lobby"; 

try 
{ 
    ChannelServices.RegisterChannel(new TcpClientChannel(), false); 
    Lobby lobby = (Lobby)Activator.GetObject(
     typeof(Lobby), url); 
} 
catch (Exception e) 
{ 
} 

Это прекрасно работает, и мы могут вызвать методы на объекте лобби. Однако, позже в коде, мы возвращаемся другой объект, таблица выглядит следующим образом:

table_proxy = lobby_proxy.joinTable(userID, i); 

где lobby_proxy тот же объект лобби в предыдущем коде. Сервер настроен следующим образом:

_port = global::Server.Properties.Settings.Default.Port; 
_lobby = new Lobby(_db); 

try 
{ 
    TcpServerChannel channel = new TcpServerChannel(_port); 
    ChannelServices.RegisterChannel(channel, false); 
    RemotingConfiguration.RegisterWellKnownServiceType(typeof(Lobby), 
      "Lobby", WellKnownObjectMode.Singleton); 
    RemotingServices.Marshal((_lobby), "Lobby"); 
    System.Console.WriteLine("Press Any Key"); 
} 
catch (Exception e) 
{ 
    System.Console.WriteLine(e); 
} 

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

System.Net.Sockets.SocketException (0x80004005): A socket operation was attempte 
d to an unreachable network 169.254.171.86:9932 
    Exit 
Server stack trace: 
    at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddre 
ss socketAddress) 
    at System.Net.Sockets.Socket.Connect(EndPoint remoteEP) 
    at System.Runtime.Remoting.Channels.RemoteConnection.CreateNewSocket(EndPoint 
ipEndPoint) 
    at System.Runtime.Remoting.Channels.RemoteConnection.CreateNewSocket() 
    at System.Runtime.Remoting.Channels.RemoteConnection.GetSocket() 
    at System.Runtime.Remoting.Channels.SocketCache.GetSocket(String machinePortA 
ndSid, Boolean openNew) 
    at System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.SendRequestWit 
hRetry(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream) 
    at System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.ProcessMessage 
(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITranspor 
tHeaders& responseHeaders, Stream& responseStream) 
    at System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMess 
age(IMessage msg) 

Exception rethrown at [0]: 
    at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage req 
Msg, IMessage retMsg) 
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgDa 
ta, Int32 type) 
    at JackOfTrades.Common.Table.GetTableData(Boolean full) 

Глядя на верхней части, это IP-адрес, который я не распознаю, он ни в сети, ни в IP-маршрутизаторе.

Любые мысли о том, что не так? Помощь будет принята с благодарностью!

+0

IP-: '169.254.171.86' выглядит как окна IP-адрес автоконфигурации, который обычно возникает в результате сетевого адаптера (например, вторичный адаптер), что ISN подключен к сети. Есть ли где-нибудь в коде, где вы пытаетесь обнаружить IP-адрес локального компьютера и, возможно, не являетесь конкретным в отношении того, к какому адаптеру вы получаете адрес? – CodingGorilla

ответ

3

Вам нужно настроить TcpServerChannel с следующим параметром:

bindTo
Строка, которая определяет IP-адрес сетевой карты (NIC), к которому канал сервер должен связываться. Значение по умолчанию - System.Net.IPAddress.Any.

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

ОБНОВЛЕНО:

IDictionary properties = new Hashtable(); 
properties["port"] = 9932; 
properties["bindTo"] = "192.168.1.141"; 
TcpServerChannel channel = new TcpServerChannel(properties, null); 
ChannelServices.RegisterChannel(channel, false); 
+0

Я изучал это, и я не могу понять, как использовать bindTo в TcpServerChannel. Любые ресурсы, которые показывают, как? Кажется, это не доступный вариант. – achinda99

+0

Спасибо, что решили проблемы в целом. – achinda99

1

Адрес 168.254.x.x обычно отображается, когда сетевой адаптер не может получить адрес DHCP.

Я бы проверял, чтобы убедиться, что машина, на которой работает данный код, имеет действительный IP-адрес.

+0

Ну, я тестирую это в домашней сети, где маршрутизатор предоставляет 192.168.1.x IP-адреса. И правильные IP-адреса используются в файлах конфигурации для создания соединения. Я не знаю, откуда вытащить 168.254.x.x. – achinda99