刚学vc,做一个测定一段ip哪些地址指定端口开放的程序,定义两个CIPAddressCtrl,通过GetAddress分别得到两个ip,一个为起始地址,一个为终止地址,怎么换算中间那些地址呢?用加一循环好像不行。请教各位大虾,谢了。

解决方案 »

  1.   

    用成员函数;
    int GetAddress( BYTE& nField0, BYTE& nField1, BYTE& nField2, BYTE& nField3 );
    获得的就是每个域(4个)的值。然后就可以处理了:)
      

  2.   

    是这么搞的,取出来后怎么处理呢?
    比如,取出来192.168.0.10和192.168.0.200,我怎么通过运算得到中间的192.168.0.11……这些地址呢,我先是以为加一,再SetAddress循环可以,可试了不行:(
      

  3.   

    兄弟啊,好象是反的哦。就是说,nField0对应 10  nField1对应 0 nField2对应 168
    nField3对应192 哦。
    再试试?
      

  4.   

    又试了一下,好像反是没反。问一下,是不是mfc在set过后,再get出来格式就变了?变成它内部设的格式了?
      

  5.   

    //取地址
    DWORD dwAddress1,dwAddress2;
    BYTE bAdda,bAddb,bAddc,bAddd;
    m_ipaddress1.GetAddress(dwAddress1);
    m_ipaddress2.GetAddress(dwAddress2);
    m_ipaddress1.GetAddress(bAdda,bAddb,bAddc,bAddd);

    //换算地址个数
    UINT nAddressNumber;
    nAddressNumber=dwAddress2-dwAddress1;


    LPCSTR pstrCurrentIp;
    CIPAddressCtrl ipadd; //ping范围内地址
    for(UINT i=0;i<=nAddressNumber;i++)
    {
    pstrCurrentIp=btoip(bAdda,bAddb,bAddc,bAddd);
    run(pstrCurrentIp);
    bAddd+=1;

    ipadd.SetAddress(bAdda,bAddb,bAddc,bAddd);
    //ipadd.GetAddress(bAdda,bAddb,bAddc,bAddd);
    }
    开始是想用DWORD那个来set的,可以让ip跨的域要多一点,可是再get回去时,好像就不行了
      

  6.   

    ipadd.SetAddress(bAdda,bAddb,bAddc,bAddd);?
    这句话就不用了吧?
      

  7.   

    不用ipadd.SetAddress(bAdda,bAddb,bAddc,bAddd);
    这句是用来设置控件的显示内容的,
    跟程序内部处理无关,
    你的做法应该是正确的,
      

  8.   

    from zdnet那么用户如何指定他想要PING的IP地址的范围呢?这个程序使用了类似IP地址掩码的想法。由用户指定一个初始地址,比方202.197.73.20 以及掩码的位数,比方是8,那么IP地址的范围的上限也即IPAddr_up就由掩码和初始IP地址的异或值决定。在这个例子中,掩码的二进制是00000000000000000000000011111111 其最后8位为1 与初始IP地址异或以后就变成了202.197.73.255。这时,程序会检查从202.197.73.20到202.197.73.255的所有IP地址。而当我们把掩码的数位改成16时。程序会检查从202.197.73.20 到202.197.255.255的所有IP地址。
    值得注意的是,IP地址在内存中的位置与其显示出来的位置正好相反。当我们把IP地址这四个字节看成是一个整型变量的时候。比方202.197.73.20,202所对应的16进制数ce被放到了最后一个字节, 197, 73, 20所对应的16进制数分别为c5, 49, 14 。则内存中这个整型变量的值为1449c5ce。而202.197.73.255所对应的整型数值为ff49c5ce。可以看出,如果我们需要遍历这个范围中的所有IP地址。我们并不能同通过简单的在初始IP地址上加1来实现。而是应该加上0x01000000,一直到ff49c5ce这个数。容易推出一般的公式,当用户指定的掩码数位为iMask时。每次遍历所应该加上的值为1<<(32-iMask),这也是你在上面的代码中所看见的。