客户端如何与具有多个适配器的计算机上的 Windows 服务进行通信

本文关键字:计算机 Windows 通信 服务 适配器 客户端 | 更新日期: 2023-09-27 18:33:33

我继承了一个用C#编写的Windows Service + Client应用程序。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地址,哦,服务运行在TCP端口ExportServiceRequest.DefaultPort上$LOCALHOST$?我想和你谈谈",并让随后的 TCP/IP 对话正常工作。

客户端如何与具有多个适配器的计算机上的 Windows 服务进行通信

Socket.Bind

在调用 Bind 之前,必须首先创建要从中传递数据的本地IPEndPoint。如果您不关心分配哪个本地地址,则可以使用 IPAddress.Any 作为地址参数创建IPEndPoint,基础服务提供商将分配最合适的网络地址。如果您有多个网络接口,这可能有助于简化应用程序。

(着重号后加(。因此,这将是一个建议的更改。

我还建议将Connect呼叫切换到Connect(string,int)

建立与远程主机的连接。主机由主机名和端口号指定。

('localhost'host值应该足够了(

也就是说,摆脱所有这些关于DNS等的麻烦,只依靠底层基础设施来解决这些问题。