基于TCP/IP协议簇的对等网络通信下,相互通信的应用程序运行各自的进程中,出于应用层的进程将数据局封装成数据报,并通过传输层的TCP或者UDP进行网络通信。而TCP和UPD则通过一个16bit的端口来识别不同的应用程序。
对于一些常用网络服务,他们都有一个知名的端口好与之匹配。比如,FTP服务是用的TCP端口为21;Telnet服务的TCP端口为23等等。而对于客户端通常对所使用的端口并不关心,只需要保证端口在本机是唯一的就可以了,这样的端口又成为临时端口,临时端口一般在1024到5000之间。
一般来讲,在某一个时刻,一个端口只能供一个应用程序使用。对于WCF来说,当我们通过一个托管的应用程序对某个服务进行寄宿的时候,一个端口被该应用程序独占使用。如何多个寄宿进行使用相同的端口
在下面的例子中,我通过两个不同的控制台应用程序对两个服务,Service1和Service2进行寄宿,两个服务的终结点地址共享相同的端口:9999。
using(ServiceHost serviceHost = new ServiceHost(typeof(Service1)))
{
serviceHost.AddServiceEndpoint(typeof(IService1), new NetTcpBinding(), "net.tcp://127.0.0.1:9999/service1");
serviceHost.Open();
Console.Read();
}
using(ServiceHost serviceHost = new ServiceHost(typeof(Service2)))
{
serviceHost.AddServiceEndpoint(typeof(IService2), new NetTcpBinding(), "net.tcp://127.0.0.1:9999/service2");
serviceHost.Open();
Console.Read();
}
当我们先后运行这两个服务寄宿应用程序,第一个能够正常运行,但是对于第二个,则会抛出如下一个AdressAlreadyInUseException异常,错误信息为:
IP 终结点 127.0.0.1:9999 上已有侦听器。请确保未在应用程序中多次尝试使用该终结点,并确保没有其他应用程序在侦听该终结点。
在本节中,我们将介绍如何解决这种端口被某一个应用程序独占使用的问题,让不同的监听程序能够共享同一个端口。在这之前,我们需要了解一下,端口的共享具有什么现实的意义。