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

时间:2012-05-09 13:08:03

标签: c# windows-services dns

我继承了用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地址,哦服务在$ LOCALHOST $上的TCP端口ExportServiceRequest.DefaultPort上运行?我想跟你说话”,并且有随后的TCP / IP会话正常工作。

1 个答案:

答案 0 :(得分:1)

Socket.Bind

  

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

(重点补充)。所以这将是一个建议的改变。

我还建议您将Connect来电转为Connect(string,int)

  

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

host 'localhost'值应该足够了)

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