如何为IP地址定义TcpListener

时间:2015-04-04 09:04:49

标签: c# .net tcp tcplistener

我已经查看了TcpListenersTcpClients的一些示例,在一个示例中,服务器端TcpListener被声明为这样

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

而在另一个例子中它就像这样

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

逻辑上,第一种方法应该使用机器的默认外部IP地址,其中第二种方法是明确指定的。

所以我在问,定义它的最佳方法是什么?如果服务器机器具有动态IP地址,会发生什么?如果它与动态IP有关,它会在第二种方法中出错吗? 如果客户端应用程序不知道它要连接的IP地址(如果它是动态的),它将如何连接到服务器?

1 个答案:

答案 0 :(得分:1)

  

所以我在问,定义它的最佳方法是什么?

这取决于你想要的行为。这就是API提供选项的原因:一种尺寸并不一定适合所有。

在某些计算机上有多个网络适配器,在某些计算机上,最好将服务器的操作限制为这些适配器的某个子集,甚至只限一个。在这些情况下,提供一种将套接字绑定到一个适配器的方法很有用。

在其他情况下,服务器最好监听所有可用的网络适配器。在这种情况下,使用默认(或明确提供IPAddress.Any)是“最佳方式”(即唯一的方式)。

  

如果服务器机器有动态IP地址,会发生什么?它是否会在第二种方法中出错,如果是动态IP?

如果提供了正确的IP地址,它将正常工作。 IP地址是动态的这一事实并不排除将其用于TCP侦听套接字。

如果提供了错误的IP地址(即未分配给机器的IP地址),则会发生错误。

  

如果客户端应用程序不知道它要连接的IP地址(如果它是动态的),它将如何连接到服务器?

如果网络客户端不知道IP地址,则无法连接到网络服务器。

但是,具有动态IP地址的服务器不一定会阻止客户端知道该地址。

即使在非动态场景中,客户端学习IP地址的最常用方法是询问DNS服务器,该服务器将文本名称解析为实际IP地址。有些服务为具有动态IP地址的服务或机器提供DNS名称解析;他们通常通过使用固定域名,将动态寻址服务器分配给子域来实现此目的。

例如,您可以从noip.com订阅服务,从域名skaidar.noip.com购买。然后客户端会查找该名称,正常的DNS解析会将其转换为服务器的IP地址。如果动态分配的IP地址发生变化,则此类服务要求您的服务器或某些相关计算机主动更新提供程序的名称解析信息;不同的提供者有不同的机制来做到这一点。

当然,人类总是可以找到动态分配的IP地址,然后直接输入该地址供客户端使用。 :)