- PR -

NIC2枚を使用した.NET Remotingについて

1
投稿者投稿内容
kernel
常連さん
会議室デビュー日: 2005/10/05
投稿数: 22
投稿日時: 2005-10-05 13:16
はじめまして。

NICが2枚ささったマシンがあります。1枚目は社内のネットワークに、
接続されていて、IPは自動取得しています。もう1枚はクロスケーブルで、
別のマシンにP2P接続していて、ローカルなIPを固定で設定しています。

このマシンでサーバプログラムを起動します。そしてPSP接続したマシンで
クライアントプログラムを起動し、.NET Remotingでサーバと通信します。

次に社内のネットワークにつながったマシンで、同じクライアントプログラムを
起動し、.NET Remotingでサーバと通信しようとすると、例外が発生して通信
できません。例外のメッセージは以下の通りです。

「接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。
または接続済みのホストが応答しなかったため、確立された接続は失敗しました。」

P2P接続されたマシンのネットワークを無効にすると、社内ネットワークのマシン
からも通信できます。

EtheRealで見ると、例外が発生する時はP2P接続用に固定で設定したIPがサーバから
返ってきます。

同じようなトラブルにあわれた方いらっしゃいましたら、解決方法を教えてください。
例外が発生している箇所は、下の一文です。
ILease myLease = (ILease)RemotingServices.GetLifetimeService(remoteObject);

****************************************
//サーバ側のコード
//開始メッセージを表示します。
Console.WriteLine("サーバが立ち上がります...");

// リース パラメータの初期化
LifetimeServices.LeaseManagerPollTime = TimeSpan.FromSeconds(1);
LifetimeServices.LeaseTime = TimeSpan.FromSeconds(10);
LifetimeServices.RenewOnCallTime = TimeSpan.Zero;
//LifetimeServices.RenewOnCallTime = TimeSpan.FromSeconds(3);
LifetimeServices.SponsorshipTimeout = TimeSpan.FromMinutes(1);

//通信チャンネルを登録します。
BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();
provider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
IDictionary props = new Hashtable();
props["port"] = 8000;
ChannelServices.RegisterChannel(new TcpChannel(props, null, provider));

//サービスタイプを登録します。
RemotingConfiguration.RegisterActivatedServiceType(
typeof(RemoteClass));
RemotingConfiguration.ApplicationName = "MyApp";

Console.WriteLine("[Enter]キーを押すと、サーバが停止されます。");
Console.ReadLine();

****************************************
//クライアント側のコード
//逆シリアル化レベルをFullに設定
BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();
provider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
IDictionary props = new Hashtable();
props["port"] = 0;

//チャンネルを登録します。
ChannelServices.RegisterChannel(new TcpChannel(props, null, provider));

//プロキシ オブジェクトを生成します。
RemotingConfiguration.RegisterActivatedClientType(
typeof(RemoteClass),
"tcp://Chikichiki:8000/MyApp");
remoteObject = new RemoteClass();
try
{
//リースのスポンサーを登録
ILease myLease = (ILease)RemotingServices.GetLifetimeService(remoteObject);
myLease.Register(new SponsorClass());

}
catch (Exception exp)
{
MessageBox.Show(exp.Message);

}
****************************************
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-10-05 21:28
エラーメッセージどおりの原因ではないのですか?
サーバー名「Chikichiki」の名前解決はどうしています?
IPアドレスのルーティングは正しく設定されていますか?

コード:
ping Chikichiki


クライアントから上記のコマンドを実行したとして、ちゃんと応答帰ってきます?
クライアントからIPアドレスを指定して接続したら、ちゃんと動いたりしません?
kernel
常連さん
会議室デビュー日: 2005/10/05
投稿数: 22
投稿日時: 2005-10-06 10:19
返答ありがとうございます。

基本的な調査は一通りやったつもりです。pingをとばすと、IPアドレスが帰ってきます。
そして、P2P接続したマシンのプログラムには、固定で設定したNICのアドレスを、
社内のネットワークから通信するマシンのプログラムには、自動取得したアドレスを
リテラルで書いてみましたが、結果は同じです。

質問内容にも書いた通り、クロスケーブルで接続したマシンのネットワークを無効にすれば、
正常に通信できます。もちろん、NICが一枚しかないマシンにサーバ側プログラムを置いて、
そのマシンと通信しても正常に動作します。
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2005-10-06 13:17
南部です。

こちらでは同様の環境がないので試せませんが、
サーバチャネルのプロパティに
props["machineName"] = "Chikichiki"; //もしくはIPアドレス
を追加したらどうなります?

#MSDNのどっかに書いてあったはずだけど、、、
#探すと見つからない、、、

[追加]
見つかりました。
props["bindTo"] = "IPアドレス"
が正解のようです。

[ メッセージ編集済み 編集者: nanbu 編集日時 2005-10-06 13:23 ]

[追加]
ソースを記載し忘れので、
MSDNライブラリの
ms-help://〜/〜/cpguide/html/cpconChannelFormatterConfigurationProperties.htm
です。

[ メッセージ編集済み 編集者: nanbu 編集日時 2005-10-06 13:28 ]
kernel
常連さん
会議室デビュー日: 2005/10/05
投稿数: 22
投稿日時: 2005-11-08 16:45
自己解決しました。
1つのチャネルで、異なるネットワークのクライアントから同時にアクセスする
ためには、IP アドレスではなく、双方のネットワークで解決可能なホスト名を
指定する必要があります。

具体的にはサーバ側で、TcpChannel の useIpAddress プロパティをFalseに
設定と直ります。
1

スキルアップ/キャリアアップ(JOB@IT)