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

标签 c# windows-services dns

我继承了一个用 C# 编写的 Windows 服务 + 客户端应用程序。 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 对话正常工作。

最佳答案

Socket.Bind :

Before calling Bind, you must first create the local IPEndPoint from which you intend to communicate data. If you do not care which local address is assigned, you can create an IPEndPoint using IPAddress.Any as the address parameter, and the underlying service provider will assign the most appropriate network address. This might help simplify your application if you have multiple network interfaces.

(强调)。因此,这将是一个建议的更改。

我还建议将您的 Connect 调用切换到 Connect(string,int) :

Establishes a connection to a remote host. The host is specified by a host name and a port number.

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

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

关于c# - 客户端如何与具有多个适配器的计算机上的 Windows 服务通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10516797/

相关文章:

c# - 401 上的自定义 [授权] 消息

python - 在 python 中使用 CreateProcessAsUser 不会将用户的环境传递给创建的进程

c# - C# 中的 Windows 服务 - 崩溃/错误

php - DNS 在 PHP 中不工作(但一般情况下可以)

log4net - 我应该直接在域模型对象中使用 log4net 吗?

c# - 用户代码是否重新抛出 OperationCanceledException,从其自己的 try-catch 中捕获

c# - 如何在 C# 中编写 Windows 服务来为用户启动应用程序?

go - 指定用于在 Go 中查找的 DNS 服务器

c# - 如何替换2个文件?

c# - 在 WinService 或 WinForms 应用程序中通过 URL 目录获取文件名