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会話は正常に機能します。