2015-04-04 74 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地址,然后直接输入以供客户端使用。 :)