我继承了用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会话正常工作。
答案 0 :(得分:1)
在调用
Bind
之前,您必须首先创建要从中传输数据的本地IPEndPoint
。如果您不关心分配了哪个本地地址,则可以使用IPEndPoint
作为地址参数创建IPAddress.Any
,并且基础服务提供商将分配最合适的网络地址。 如果您有多个网络接口,这可能有助于简化您的应用程序。
(重点补充)。所以这将是一个建议的改变。
我还建议您将Connect
来电转为Connect(string,int)
:
建立与远程主机的连接。主机由主机名和端口号指定。
(host
'localhost'
值应该足够了)
也就是说,摆脱DNS等所有这些问题,只需依靠底层基础设施来解决这些问题。