簡體   English   中英

客戶端如何與具有多個適配器的計算機上的Windows服務通信?

[英]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對話正常工作。

Socket.Bind

在調用Bind之前,您必須首先創建要用來與之通信數據的本地IPEndPoint 如果您不關心分配了哪個本地地址,則可以使用IPAddress.Any作為地址參數來創建IPEndPoint ,基礎服務提供商將分配最合適的網絡地址。 如果您有多個網絡接口,這可能有助於簡化您的應用程序。

(強調)。 因此,這將是一項建議的更改。

我還建議將您的Connect調用切換為Connect(string,int)

建立與遠程主機的連接。 主機由主機名和端口號指定。

(在那里, host'localhost'就足夠了)

也就是說,擺脫所有與DNS等相關的問題,僅依靠底層基礎結構來解決這些問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM