IP循环的问题?

mjjzg 2008-10-08 03:24:46
做了个IP扫描端口的小工具,即将完工,可突然卡在了循环上,越写越不对了,求助
谁能给我写个输出一段IP的代码,让我参考一下
如从1.1.1.1~~2.2.2.2
该如何累加输出
...全文
294 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
mjjzg 2008-10-08
  • 打赏
  • 举报
回复
谢谢phy和justindreams两位了,本来这个小工具中午就能完工的,就因为这个查询网段的问题,足足困扰了我一个下午,
再次说声谢谢
A5289603 2008-10-08
  • 打赏
  • 举报
回复

//这个方法测试可行.不过要求位运算

//应该是最快最简单的一种了

string ip;
int a = 1 < <24 | 1 < <16 | 1 < <8 | 1; //1.1.1.1
int b = 2 < <24 | 2 < <16 | 2 < <8 | 2; //2.2.2.2
for(;a <= b;a++)
{
ip = (byte)(a>>24) + ".";
ip += (byte)(a>>16) + ".";
ip += (byte)(a>>8) + ".";
ip += (byte)(a);
}
//这个只是样版适当改改应该可以拿去用了


justindreams 2008-10-08
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 A5289603 的回复:]
这个方法测试可行.不过要求位运算

应该是最快最简单的一种了
string ip;
int a = 1 < <24 | 1 < <16 | 1 < <8 | 1;
int b = 2 < <24 | 2 < <16 | 2 < <8 | 2;
for(;a <= b;a++)
{
ip = (byte)(a>>24) + ".";
ip += (byte)(a>>16) + ".";
ip += (byte)(a>>8) + ".";
ip += (byte)(a);
}
[/Quote]

这个思路是最好的,我就是想这么写来着,但我不会
jankrong 2008-10-08
  • 打赏
  • 举报
回复
顶了!
A5289603 2008-10-08
  • 打赏
  • 举报
回复
这个方法测试可行.不过要求位运算

应该是最快最简单的一种了
string ip;
int a = 1<<24 | 1<<16 | 1<<8 | 1;
int b = 2<<24 | 2<<16 | 2<<8 | 2;
for(;a <= b;a++)
{
ip = (byte)(a>>24) + ".";
ip += (byte)(a>>16) + ".";
ip += (byte)(a>>8) + ".";
ip += (byte)(a);
}
justindreams 2008-10-08
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 phy 的回复:]
引用 13 楼 justindreams 的回复:
还是有点问题,改了
下面这个应该不会有问题了,其实我还有另外一个方法,就不是纯数字的运算了。
C# codestringipStr1="1.1.1.1";stringipStr2="1.1.2.2";string[] ipArray1=ipStr1.Split(newchar[] {'.'});string[] ipArray2=ipStr2.Split(newchar[] {'.'});longipStart=256*256*256*long.Parse(ipArray1[0])+256*256*long.Parse(ipArray1[1])+256*long.Parse(ipArray1[2])+long.Parse(i…
[/Quote]

不可以的,直接用的话,要反向才可以。
比如192.168.1.1如果用IPAddress.Address的话,得到的是16885952
而如果算的话,应该是3232235777

192.168.1.1是1*256*256*256+1*256*256+168*256+192
brallow 2008-10-08
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 mjjzg 的回复:]
网络地址和广播地址我会扫,现在的问题就是扫个网段了,单个的我可以扫
代码太多了,为什么我找不到OutputIpAddress啊
这个OutputIpAddress在哪
[/Quote]
网络地址和广播地址也要的话,你把
secStart = 0;
secEnd = 255;
就OK了,这样子我的代码不会有问题的。

我没有仔细检查justindreams的代码,但从它的算法来看应该是正确的,只是看起来没那么直观。
IP地址本来就是一个32位的整数,你可以得到这两个IP地址的整数:A,B后直接
for(int i = A;i<=B;i++)
来遍历所有的地址。

brallow 2008-10-08
  • 打赏
  • 举报
回复
晕,outputipaddress是我自己写的输出到文本文件中的,检查起来方便一点。:)

private static StreamWriter sw;

private static void OutputIpAddress(byte a, byte b, byte c, byte d)
{
Output(string.Format("{0}.{1}.{2}.{3}", a, b, c, d));
}

private static void Output(string s)
{
if (sw == null) sw = File.CreateText(@"E:\desktop\1.txt");
sw.WriteLine(s);
}



对了再提醒一下楼上的:
IPAddress.Address这个属性将来不被支持。主要是因为IPv6的关系。
mjjzg 2008-10-08
  • 打赏
  • 举报
回复
我现在有点事要出去一趟,晚上9点钟回来,那时再一试代码,如有正确的立刻揭贴
PHY能否将你的原文给我帖一下或发到我的邮箱里,我真的不想再做这段了,准备直接帖上去完工
我邮箱mjj521@hotmail.com
出去了,晚上揭贴
brallow 2008-10-08
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 justindreams 的回复:]
还是有点问题,改了
下面这个应该不会有问题了,其实我还有另外一个方法,就不是纯数字的运算了。
C# codestringipStr1="1.1.1.1";stringipStr2="1.1.2.2";string[] ipArray1=ipStr1.Split(newchar[] {'.'});string[] ipArray2=ipStr2.Split(newchar[] {'.'});longipStart=256*256*256*long.Parse(ipArray1[0])+256*256*long.Parse(ipArray1[1])+256*long.Parse(ipArray1[2])+long.Parse(ipArray1[3]);longipEnd=256*256*256*l…
[/Quote]
这个方法是可以的,但你上面的代码可以直接用:
System.Net.IPAddress ip = IPAddress.Parse("1.1.1.1");
long ipStart = ip.Address;

得到,不用自己算。
但是中间的IP地址包括大量的网络地址和广播地址,这些也要处理的。

我的代码也有问题,对于网络地址和广播地址我简单的用0,255识别的,显然这不正确。
应该在不同的网段中(比如:0-127),后3个字节均为网络地址,不能均为0但可以部分为0。
这些还只是复杂,但是对于有子网掩码的情况,如果不知道掩码根本就无法处理了……
justindreams 2008-10-08
  • 打赏
  • 举报
回复
LZ,试试我的第二段代码吧
mjjzg 2008-10-08
  • 打赏
  • 举报
回复
网络地址和广播地址我会扫,现在的问题就是扫个网段了,单个的我可以扫
代码太多了,为什么我找不到OutputIpAddress啊
这个OutputIpAddress在哪
justindreams 2008-10-08
  • 打赏
  • 举报
回复
如果末尾不要0和255的话,循环体中判断一下d是不是0或255就好了。
其实IPv4的IP是4段8位二进制数组成的,知道这个就简单了,可以看成是256进制的一个数字。
brallow 2008-10-08
  • 打赏
  • 举报
回复
仔细又测试了一次,应该没问题。
上面的secStart和secEnd你可以自己设,这样你就可以选择是否扫描网络地址和广播地址了。
justindreams 2008-10-08
  • 打赏
  • 举报
回复
还是有点问题,改了
下面这个应该不会有问题了,其实我还有另外一个方法,就不是纯数字的运算了。

string ipStr1 = "1.1.1.1";
string ipStr2 = "1.1.2.2";
string[] ipArray1 = ipStr1.Split(new char[] { '.' });

string[] ipArray2 = ipStr2.Split(new char[] { '.' });

long ipStart = 256 * 256 * 256 * long.Parse(ipArray1[0]) + 256 * 256 * long.Parse(ipArray1[1]) + 256 * long.Parse(ipArray1[2]) + long.Parse(ipArray1[3]);
long ipEnd = 256 * 256 * 256 * long.Parse(ipArray2[0]) + 256 * 256 * long.Parse(ipArray2[1]) + 256 * long.Parse(ipArray2[2]) + long.Parse(ipArray2[3]);

List<string> SearchIPArray = new List<string>();//存放你的中间IP

for (long i = ipStart; i <= ipEnd; i++)
{
long tmp = i;
long a = tmp / (256 * 256 * 256);
tmp -= a * (256 * 256 * 256);
long b = tmp / (256 * 256);
tmp -= b * 256 * 256;
long c = tmp / 256;
tmp -= c * 256;
long d = tmp;
SearchIPArray.Add(a.ToString() + "." + b.ToString() + "." + c.ToString() + "." + d.ToString());
}
justindreams 2008-10-08
  • 打赏
  • 举报
回复
代码经过测试的,使用没问题。
justindreams 2008-10-08
  • 打赏
  • 举报
回复


string ipStr1 = "1.1.1.1";
string ipStr2 = "1.1.1.4";
string[] ipArray1 = ipStr1.Split(new char[] { '.' });

string[] ipArray2 = ipStr2.Split(new char[] { '.' });

long ipStart = 256 * 256 * 256 * long.Parse(ipArray1[0]) + 256 * 256 * long.Parse(ipArray1[1]) + 256 * long.Parse(ipArray1[2]) + long.Parse(ipArray1[3]);
long ipEnd = 256 * 256 * 256 * long.Parse(ipArray2[0]) + 256 * 256 * long.Parse(ipArray2[1]) + 256 * long.Parse(ipArray2[2]) + long.Parse(ipArray2[3]);

List<string> SearchIPArray = new List<string>();//存放你的中间IP

for (long i = ipStart; i <= ipEnd; i++)
{
long tmp = i;
long a = tmp / (256 * 256 * 256);
tmp -= 256 * 256 * 256;
long b = tmp / (256 * 256);
tmp -= 256 * 256;
long c = tmp / 256;
tmp -= 256;
long d = tmp;
SearchIPArray.Add(a.ToString() + "." + b.ToString() + "." + c.ToString() + "." + d.ToString());
}

mjjzg 2008-10-08
  • 打赏
  • 举报
回复
7楼的方法不行的
你的这个循环怎么能那样
循环它判断的不是和末尾的IP进行比较,而是当累加到255的时候就向前一位+1
brallow 2008-10-08
  • 打赏
  • 举报
回复
这段代码经过测试,编译通过。大体测试了一下,你再仔细测一下。
我自己加了一个IP结构,主要是为了看起来方便,因为如果直接使用IPaddress内置的数组实在是太麻烦了,很容易写错。

public struct IP
{
public byte A;
public byte B;
public byte C;
public byte D;

public IP(byte[] ba)
{
A = ba[0];
B = ba[1];
C = ba[2];
D = ba[3];
}
}

public static void IPSection(IPAddress ip1, IPAddress ip2)
{
IP x = new IP(ip1.GetAddressBytes());
IP y = new IP(ip2.GetAddressBytes());

byte secStart = 1; //这里可以改为0
byte secEnd = 254; //这里可以改为255

for (byte a = x.A; a <= y.A; a++)
{
byte bStart = (a == x.A ? x.B : secStart);
byte bEnd = (a == y.A ? y.B : secEnd);

for (byte b = bStart; b <= bEnd; b++)
{
byte cStart = (a == x.A && b == x.B) ? x.C : secStart;
byte cEnd = (a == y.A && b == y.B) ? y.C : secEnd;

for (byte c = cStart; c <= cEnd; c++)
{
byte dStart = (a == x.A && b == x.B && c == x.C) ? x.D : secStart;
byte dEnd = (a == y.A && b == y.B && c == y.C) ? y.D : secEnd;

for (byte d = dStart; d <= dEnd; d++)
{
OutputIpAddress(a, b, c, d);
}
//这个是测试用的,只输出这一网段最后一位的起止位置,不输出全部。
//Output("========输出网段========");
//OutputIpAddress(a, b, c, dStart);
//OutputIpAddress(a, b, c, dEnd);
}
}
}
}
beipiao1008 2008-10-08
  • 打赏
  • 举报
回复

public string OutPutIp()
{
string ip;
if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_ForWARDED_For"] == null)
{
ip = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"].ToString();
}
else
{
ip = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_ForWARDED_For"].ToString();
}

reture ip;
}

先获得IP,再进行判断输入,如不为空,则进行输入,这样的话,扫到一个就能输出一个了.
加载更多回复(7)

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧