客户端如何与具有多个适配器的计算机上的 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 对话正常工作。
Socket.Bind
:
在调用
Bind
之前,必须首先创建要从中传递数据的本地IPEndPoint
。如果您不关心分配哪个本地地址,则可以使用IPAddress.Any
作为地址参数创建IPEndPoint
,基础服务提供商将分配最合适的网络地址。如果您有多个网络接口,这可能有助于简化应用程序。
(着重号后加(。因此,这将是一个建议的更改。
我还建议将Connect
呼叫切换到Connect(string,int)
:
建立与远程主机的连接。主机由主机名和端口号指定。
('localhost'
的host
值应该足够了(
也就是说,摆脱所有这些关于DNS等的麻烦,只依靠底层基础设施来解决这些问题。