2013-03-21 42 views
0

我正在C#中構建一個客戶端服務器應用程序,其中服務器是遠程主機。我的網絡中有路由器和防火牆。爲什麼IPAddress.Any需要連接到遠程主機?

我的客戶端代碼

hostSocket = new TcpClient();     
hostSocket.Connect(serverIp, serverPort); 

而且我的服務器端代碼是

eqListner = new TcpListener(IPAddress.Parse(eqIp), eqPort);

在這種情況下,我能給予的ip 127.0.0.1在同一臺PC上的客戶端連接但是當我在我的網絡中的另一臺PC上運行服務器時無法連接。

然後我按照改變了我的服務器端代碼:

IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0]; 
IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, eqPort); 
TcpListener eqListner = new TcpListener(ipLocalEndPoint); 

但還是結果是一樣的。然後,我又改變了我的服務器端代碼通過這樣的:

eqListner = new TcpListener(IPAddress.Any, eqPort);

這工作完全正常。我讀過IPAddress.Any的msdn,發現此屬性設置服務器偵聽所有網絡接口上的客戶端活動。

我的問題是爲什麼IPAddress.Any需要連接到遠程主機?和其他功能無法連接?

在此先感謝....

回答

0
在這種情況下,我能給予的ip 127.0.0.1在同一臺PC連接的客戶端,但是當我跑另一臺PC服務器我的網絡

在不能連接

127.0.0.1是始終是本地主機的回送地址。當服務和客戶端只在同一臺機器上時,這可能很方便。

你最好在編碼服務上監聽所有接口,這樣如果服務器更改地址,則不需要更新或重新啓動應用程序。

0

問題可能出現在第一行。

IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0]; 

它會得到它運行的主機的第一個ip。這可能是IPv6或本地主機地址。 如果您想收聽特定地址,最好將其添加到project settings。它將被存儲在app.config中,您可以在不重新編譯的情況下對其進行更改。

+0

我在問'IPAddress.Any'的重要性。無論如何感謝您的答案。 – 2013-03-21 10:52:26

+0

'IPAddress.Any'將接受來自任何接口的連接。這就是爲什麼它有效。如果您正在偵聽AddressList [0],並且無法從主機外部訪問它(因爲您的網絡中沒有配置IPv6和IPv6,或者因爲它是環回,...),所以客戶端永遠不會能夠連接。 – 2013-03-21 11:24:31

+0

不,我只使用IP V.4 – 2013-03-21 11:38:12

相關問題