C#可用的TCP端口探测

5

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

3个回答

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/zh-cn/library/aa395224.aspx


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


0

你能详细说明一下吗? - Zenexer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接