在写Socket通讯服务的时候一般需要Listen某个IP地址端口,但这样比较麻烦的就是部署后需要配置相关IP地址信息;虽然可以监听Any所有地址,但这种对于私有的网络服务来说并不安全。为了在发布的时候节省一些配置工作所以才想到以IP段作为监听地址来配置。
在集群应用中都有着自己的私有网段,通过配置IP段让服务自动监听在这IP端上的端口那部署起来就相对方便一些,特别是以容器作为管理手段服务集群,这样做的好处是推送一份新的实例时服务无须再配置即可确保运行在对应IP段的地址上。
BeetleX的新版本中支持这种监听配置方式,可以在IP地址的最后一位配置为*,这样就会监听本机匹配对应网段的IP地址(不过暂只支持IPv4)。以下是内部实现代码:
System.Net.IPAddress address;
if (string.IsNullOrEmpty(Host))
{if (Socket.OSSupportsIPv6 && Server.Options.UseIPv6){address = IPAddress.IPv6Any;}else{address = IPAddress.Any;}
}
else
{if (Host.EndsWith("*")){address = MatchIPAddress(Host.Replace("*", ""));Host = address.ToString();}else{address = System.Net.IPAddress.Parse(Host);}
}
private IPAddress MatchIPAddress(string matchIP)
{var host = Dns.GetHostEntry(Dns.GetHostName());foreach (var ip in host.AddressList){if (ip.AddressFamily == AddressFamily.InterNetwork){if (ip.ToString().IndexOf(matchIP) == 0){return ip;}}}throw new Exception($"No {matchIP} IPv4 address in the system!");
}