2015-04-04 89 views
0

我已經通過TcpListenersTcpClients一些例子看,在一個例子中,服務器端的TcpListener聲明如下如何定義的TcpListener的IP地址

TcpListener listener = TcpListener.Create(8080); 
listener.Start(); 

而在另一個例子就是這個樣子

TcpListener listener = new TcpListener("78.78.78.120", 8080); 
listener.Start(); 

從邏輯上講,第一種方法應該使用機器的默認外部IP地址,其中明確指定了第二種方法。

所以我問,定義它的最好方法是什麼?如果服務器機器具有動態IP地址,會發生什麼?如果使用動態IP,它會給第二種方法帶來錯誤嗎? 如果客戶端應用程序不知道要連接的IP地址(如果它是動態的),那麼客戶端應用程序如何連接到服務器?

回答

0

所以我問,定義它的最好方法是什麼?

這取決於你想要什麼樣的行爲。這就是API提供選項的原因:一個尺寸不一定適合所有。

在某些機器上有多個網絡適配器,並且在其中一些機器上,希望將服務器的操作限制爲這些適配器的某些子集,甚至只有一個。在這些情況下,提供一種將套接字綁定到一個適配器的方法很有用。

在其他情況下,服務器希望偵聽所有可用的網絡適配器。在這種情況下,使用默認值(或明確提供IPAddress.Any)是「最佳方式」(即唯一方法)。

如果服務器機器有動態IP地址會發生什麼?如果使用動態IP,它會給第二種方法帶來錯誤嗎?

如果提供了正確的IP地址,它將正常工作。 IP地址是動態的這一事實並不妨礙它用於TCP偵聽套接字。

如果提供的IP地址不正確(即未分配給本機),則會發生錯誤。

如果客戶端應用程序不知道要連接的IP地址(如果它是動態的),它將如何連接到服務器?

如果網絡客戶端不知道IP地址,則無法連接到網絡服務器。

但是,具有動態IP地址的服務器並不一定排除客戶端知道地址。

即使在非動態場景中,客戶端學習IP地址的最常見方式是詢問DNS服務器,該服務器將文本名稱解析爲實際IP地址。有些服務爲具有動態IP地址的服務或機器提供DNS名稱解析;他們通常通過使用固定的域名來完成此操作,將動態尋址的服務器分配給子域。

例如,您可以訂閱來自noip.com的服務,從他們那裏購買域名skaidar.noip.com。然後客戶端會查找該名稱,而普通的DNS解析會將其轉換爲您的服務器的IP地址。這種類型的服務要求您的服務器或某個相關機器在動態分配的IP地址發生變化時主動更新提供者的名稱解析信息;不同的提供者有不同的機制來做到這一點

當然,人們總是可以找到動態分配的IP地址,然後直接輸入以供客戶端使用。 :)