C# 客户端如何在具有多个适配器的计算机上与Windows服务通信?

C# 客户端如何在具有多个适配器的计算机上与Windows服务通信?,c#,windows-services,dns,C#,Windows Services,Dns,我继承了一个用C#编写的Windows Service+客户端应用程序。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]

我继承了一个用C#编写的Windows Service+客户端应用程序。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
}
当客户端按如下方式连接时:

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对话正常工作。

:

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

(重点补充)。因此,这将是一个建议的改变

我还建议将您的
Connect
呼叫切换到:

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

(一个
host
'localhost'
应该足够了)


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

Title听起来像是一个非常糟糕的问题的开始,假设服务在一台机器上运行,而您提到的
DNS.resolve()
问题发生在客户机上,然后,问题似乎与您的DNS设置有关。这就是为什么客户端代码不只是使用类似于
IPHostEntry iphe=Dns.Resolve(服务器名称)的东西?呃他有吗?我猜的整个dns.gethostname()就是您作为服务器编写的部分_NAME@RhysW:正是;我不想让客户端程序的用户因为必须配置它而感到负担。我希望客户端能够以可靠的方式与服务器通信。要做到这一点,我真的必须绑定到服务器中的所有接口吗?可能对您有用@JohnKallenI不知道IPAddress。Bind()的任何选项。这似乎是一个解决方案的候选方案。我会修改它,看看它是否解决了这个问题。事实上,这是正确的做法。谢谢你的帮助!