2

私たちが取り組んでいるプロジェクトでは、サーバーとクライアント間の通信に.NETリモーティングを使用しています。これまで、ローカルホストと任意のポート番号を使用して、同じマシンでテストして動作しました。ただし、を使用して同じネットワーク上の2台のマシン間でテストする場合、メインコンポーネントは機能しますが、プロキシオブジェクトは失敗します。

次のように、構成ファイルを使用してサーバー名とポートを設定しています。

<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上にもありません。

何が悪いのかについて何か考えはありますか?助けていただければ幸いです!

4

2 に答える 2

4

次のパラメータを使用してTcpServerChannelを設定する必要があります。

bindTo
サーバーチャネルがバインドするネットワークインターフェイスカード(NIC)のIPアドレスを指定する文字列。デフォルト値は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);
于 2010-11-09T14:41:58.830 に答える
1

168.254.xxアドレスは通常、ネットワークアダプタがDHCPアドレスを取得できない場合に表示されます。

このコードを実行しているマシンに有効なIPアドレスがあることを確認します。

于 2010-11-09T14:32:51.910 に答える