使用C#的可用TCP端口探测

时间:2009-01-30 13:55:11

标签: c#

如何探测可用的TCP端口以便以编程方式配置WCF服务端点?

3 个答案:

答案 0 :(得分:3)

如果动态选择服务器端口,客户端如何了解端点?

反正

这是探测开放端口的一种肮脏方式

 for (int port = 2000; port < 65535; port++) 
                   {
                   IPEndPoint ep = new IPEndPoint(IPAddress.Any, port);
                   Socket socket = new Socket(AddressFamily.InterNetwork, st, pt);

                   try { 
                         socket.Bind(ep);
                         socket.Close();  
                         //Port available
                        } 
                   catch (SocketException)
                        {
                        Debug.WriteLine("Port not available {0}", port);
                        } 

                   }

然后,尝试创建自定义服务主机..

http://msdn.microsoft.com/en-us/library/aa395224.aspx

答案 1 :(得分:0)

不是一种特别优雅的方式,但您可以尝试打开主机并捕获AddressAlreadyInUseException例外。这消除了使用Socket和amazedsaint方法中存在的竞争条件:没有任何东西可以占用支票和您打开服务的尝试之间的端口。

所以,基本上:

ServiceHost host;

for(int port = 2000; port < 65535; port++) {
    var address = GetBaseAddress(port);
    host = new ServiceHost(typeof(MyService), address);
    try {
        host.Open();
        break;
    }
    catch(AddressAlreadyInUseException) {

    }
}

GetBaseAddress方法只会使用String.Format创建一个地址,以便将端口号放在地址模式中的正确位置。

我认为现在看起来更有意义,因为我们在.NET 4中有WCF Discovery

答案 2 :(得分:0)

您要找的是:Socket.Select