当前位置: 首页 > 编程语言 > C#

枚举范围内的IP地址共享

时间:2023-04-10 20:12:34 C#

C#:枚举范围内的IP地址如何遍历用户提供的一系列IP地址?我对格式很灵活,只要它允许指定所有范围即可。也许类似于nmap样式:'192.0.2.1'#oneIPaddress'192.0.2.0-31'#oneblockwith32IPaddresses.'192.0.2-3.1-254'#两个具有254个IP地址的块。'0-255.0-255.0-255.0-255'#整个IPv4地址空间例如,如果用户输入192.0.2-3.1-254,我想知道如何生成这个范围内所有有效IP地址的列表这样我就可以遍历它们。例如:使用系统;使用System.Collections.Generic;使用System.Linq;使用系统文本;使用System.Net;使用System.Text.RegularExpressions;namespaceIpRanges{publicclassIPRange{publicIPRange(stringipRange){if(ipRange==null)thrownewArgumentNullException();如果(!TryParseCIDRNotation(ipRange)&&!TryParseSimpleRange(ipRange))抛出新的ArgumentException();}publicIEnumerableGetAllIP(){intcapacity=1;for(inti=0;iips=newList(capacity);for(inti0=beginIP[0];i0///以CIDR表示法解析IP范围字符串。///例如“12.15.0.0/16"./////////privateboolTryParseCIDRNotation(stringipRange){string[]x=ipRange.Split('/');if(x.Length!=2)returnfalse;bytebits=byte.Parse(x[1]);uintip=0;String[]ipParts0=x[0].Split('.');for(inti=0;i>shiftBits)>shiftBits;for(intk=0;k>(3-i)*8)&255);endIP[i]=(byte)((ip2>>(3-i)*8)&255);}返回真的;}//////解析IP范围字符串“12.15-16.1-30.10-255”/////////privateboolTryParseSimpleRange(stringipRange){String[]ipParts=ipRange.Split('.');beginIP=新字节[4];endIP=新字节[4];对于(inti=0;i2)返回false;beginIP[i]=byte.Parse(rangeParts[0]);endIP[i]=(rangeParts.Length==1)?beginIP[i]:byte.Parse(rangeParts[1]);}返回真;}privatebyte[]beginIP;私有字节[]endIP;}}请参阅此处请确保片断的信用安全。使用系统;使用System.Collections.Generic;使用System.ComponentModel;使用System.Linq;使用System.Net;/*======================================================================================C#IP地址范围查找器帮助程序类(C)NahumBazes*免费用于私人和商业用途-无限制,请留下积分。*不要删除此评论*======================================================================================*/namespaceIPAddressTools{publicclassRangeFinder{publicIEnumerableGetIPRange(IPAddressstartIP,IPAddressendIP){uintsIP=ipToUint(startIP.GetAddressBytes());uinteIP=ipToUint(endIP.GetAddressBytes());while(sIP=8)ipUint+=(uint)bConvert.ConvertTo(b,typeof(uint))我认为应该这样做。staticvoidTestFunc(){byte[,]range=ParseRange("192.0.2-5.14-28");foreach(IPAddressaddrinEnumerate(range)){Console.WriteLine(addr);}}staticbyte[,]ParseRange(stringstr){如果(string.IsNullOrEmpty(str))thrownewArgumentException("str");string[]partStr=str.Split('.');如果(partStr.Length!=4)抛出新的FormatException();byte[,]range=newbyte[4,2];for(inti=0;i2)thrownewFormatException();范围[i,0]=byte.Parse(rangeStr[0]);range[i,1]=byte.Parse(rangeStr[Math.Min(rangeStr.Length-1,1)]);//删除它以允许范围环绕。//例如:254-4=254,255,0,1,2,3,4if(range[i,1]Enumerate(byte[,]range){if(range.GetLength(0)!=4)thrownewArgumentException("range");if(range.GetLength(1)!=2)thrownewArgumentException("range");for(bytea=range[0,0];a!=(byte)(范围[0,1]+1);a++){for(byteb=range[1,0];b!=(byte)(range[1,1]+1);b++){for(bytec=范围[2,0];c!=(字节)(范围[2,1]+1);c++){for(byted=range[3,0];d!=(byte)(range[3,1]+1);d++){yieldreturnnewIPAddress(newbyte[]{a,b,c,d});}}}}}我来晚了,但你的问题被重复提及,所以我只想在这里添加答案使用IPAddressRange库,你可以枚举你的IP:varstart=IPAddress.Parse("192.168.0.2");varend=IPAddress.Parse("192.168.0.254");varrange=newIPAddressRange(开始,结束);foreach(varipinrange){Console.WriteLine(ip);该库还支持CIDR表示法和范围字符串。如果内容对您有用,需要进一步了解C#学习教程,希望您多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: