[英]How does a client communicate with a Windows Service on a machine with multiple adapters?
我繼承了用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對話正常工作。
在調用
Bind
之前,您必須首先創建要用來與之通信數據的本地IPEndPoint
。 如果您不關心分配了哪個本地地址,則可以使用IPAddress.Any
作為地址參數來創建IPEndPoint
,基礎服務提供商將分配最合適的網絡地址。 如果您有多個網絡接口,這可能有助於簡化您的應用程序。
(強調)。 因此,這將是一項建議的更改。
我還建議將您的Connect
調用切換為Connect(string,int)
:
建立與遠程主機的連接。 主機由主機名和端口號指定。
(在那里, host
值'localhost'
就足夠了)
也就是說,擺脫所有與DNS等相關的問題,僅依靠底層基礎結構來解決這些問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.