2

C#で記述されたWindowsサービス+クライアントアプリケーションを継承しました。Windowsサービスは、次のようにリッスンするためにTCP/IPソケットを開きます。

socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPHostEntry iphe = Dns.Resolve(Dns.GetHostName());
socket.Bind(new IPEndPoint(iphe.AddressList[0], ExportServiceRequest.DefaultPort));
socket.Listen(2);
// Wait for incoming connections and Accept them.

クライアントが次のように接続している間:

using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
    IPHostEntry iphe = Dns.Resolve(Dns.GetHostName());
    IPEndPoint ep = new IPEndPoint(iphe.AddressList[0], ExportServiceRequest.DefaultPort);
    socket.Connect(ep);
    // Talk to the server
}

問題は、複数のネットワークアダプターを備えた特定のマシンで、「間違った」アダプターがDns.Resolve()によって選択され、クライアント接続が失敗することです。

私は、このコードが古くて悪臭を放っていて、生のソケットコードをあまりコーディングしていないことを知っています。マシンにあるネットワークアダプターの数に関係なく、少なくとも(同じマシン内からの)ローカル接続が常に成功するように、ソケットでリッスンするWindowsサービスを実装するための最良の方法はありますか?

編集:私の質問はうまく定式化されていないようです。結局のところ、構成を必要とせずに、常に同じマシン上で実行されているクライアントからWindowsサービスにアクセスできるようにしたいと思います。擬人化するために、Windowsクライアントに「どのIPアドレスと通信できますか。サービスは$ LOCALHOST $のTCPポートExportServiceRequest.DefaultPortで実行されていますか?」と叫んで、その後のTCP/IP会話は正常に機能します。

4

1 に答える 1

1

Socket.Bind:

を呼び出す前に、データの通信元となるBindローカルを作成する必要があります。IPEndPointどのローカル アドレスが割り当てられているかを気にしない場合は、アドレス パラメータとしてIPEndPoint使用IPAddress.Anyして を作成できます。これにより、基になるサービス プロバイダーが最も適切なネットワーク アドレスを割り当てます。これは、複数のネットワーク インターフェイスがある場合にアプリケーションを簡素化するのに役立つ場合があります。

(強調を追加)。したがって、それは提案された変更の 1 つです。

Connect通話を に切り替えることもお勧めしますConnect(string,int)

リモート ホストへの接続を確立します。ホストは、ホスト名とポート番号によって指定されます。

( のhost値で'localhost'十分なはずです)

つまり、DNS などをいじることをすべて取り除き、基盤となるインフラストラクチャに頼ってこれらの問題を解決してください。

于 2012-05-09T13:29:57.970 に答える