IP地址CIDR斜线记法求子网信息小工具软件(vs2010+MFC)
来源:互联网 发布:阿里云公网带宽的作用 编辑:程序博客网 时间:2024/06/10 02:31
最近在学习计算机网络,遇到根据斜线记法来确定该IP所在子网的信息,包括:子网号、子网掩码、第一个可用IP、最后一个可用IP、广播地址、可用IP数总量。
因为自己在二进制和十进制转换之间反应比较慢,所以自己决定做一个自动计算子网所有信息的小工具软件:IPTool!
下面是截图:
还是像以前一样我会介绍自己的思路和部分代码,希望感兴趣的朋友可以多交流~~
前提:
当然要明白这个小工具的实现方法,你必须会自己得出所有的子网信息,如果你都做不出来,就不可能编写一个工具出来替你完成计算。
思路:
网络号:求网络号就是让给出的IP与斜线后面的网络前缀位数如25,相与即可得结果;
子网掩码:把网络前缀8位一组转化成10进制数就行;
第一个可用地址:网络号加1就是了;
最后一个可用地址:主机号全都变成1,然后减1就是
广播地址:最后一个可用地址加1就是
可用IP数量:2^主机号-2
实现:
ip的各部分添加5个int型成员变量;其余的都为CString。
对于每个编辑控件的设置为UpdateData();TRUE/FALSE参数设置可以参看我的两外介绍VS2010MFC编程文章.
下面列出对网络前缀edit control编写的代码:
主要的想法是:网络前缀/8,保留商和余数,根据商来分别处理5种情况。
建议读者可以把下面的代码复制到VS2010里面,这样的话就有颜色,也比较容易看。
void CIPToolDlg::OnEnChangeEdit5()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialogEx::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
UpdateData(TRUE);
m_ipdiv=div(m_ipmasknum,8);
CString strtemp=_T("");
//ipamount
if (m_ipmasknum==32)
{
m_ipamount=1;
OnEnChangeEdit11();
}else
{
m_ipamount=(long)pow(2.0,(32-m_ipmasknum))-2;
OnEnChangeEdit11();
}
switch (m_ipdiv.quot)
{
case 0:
{ //netnumber
//(m_ippart2&(((int)pow(2.0,m_ipdiv.rem)-1)<<(8-m_ipdiv.rem))):是先求出网络前缀的值:(((int)pow(2.0,m_ipdiv.rem)-1)<<(8-m_ipdiv.rem))
//然后再与IP相应的一部分相与m_ippart2&;这样就能得出该部分ip的值。注意!!网络前缀是32位ip地址从左到右的1的位数,所以需要先左移位,在相与。
strtemp.Format(_T("%d.0.0.0/%d"),(m_ippart1&(((int)pow(2.0,m_ipdiv.rem)-1)<<(8-m_ipdiv.rem))),m_ipmasknum);
m_netnumber=strtemp;
OnEnChangeEdit6();
strtemp.Empty();
//netmask
strtemp.Format(_T("%d.0.0.0"),((int)pow(2.0,m_ipdiv.rem)-1)<<(8-m_ipdiv.rem));
m_netmask=strtemp;
OnEnChangeEdit7();
strtemp.Empty();
//fristip
strtemp.Format(_T("%d.0.0.1/%d"),(m_ippart1&(((int)pow(2.0,m_ipdiv.rem)-1)<<(8-m_ipdiv.rem))),m_ipmasknum);
m_fristip=strtemp;
OnEnChangeEdit8();
strtemp.Empty();
//lastip
strtemp.Format(_T("%d.255.255.254/%d"),((m_ippart1&(((int)pow(2.0,m_ipdiv.rem)-1)<<(8-m_ipdiv.rem)))+(int)pow(2.0,(8-m_ipdiv.rem))-1),m_ipmasknum);
m_lastip=strtemp;
OnEnChangeEdit9();
strtemp.Empty();
//brodcastip
strtemp.Format(_T("%d.255.255.255/%d"),((m_ippart1&(((int)pow(2.0,m_ipdiv.rem)-1)<<(8-m_ipdiv.rem)))+(int)pow(2.0,(8-m_ipmasknum))-1),m_ipmasknum);
m_brodcast=strtemp;
OnEnChangeEdit10();
strtemp.Empty();
}break;
case 1:
{ //netnumber
strtemp.Format(_T("%d.%d.0.0/%d"),m_ippart1,(m_ippart2&(((int)pow(2.0,m_ipdiv.rem)-1)<<(8-m_ipdiv.rem))),m_ipmasknum);
m_netnumber=strtemp;
OnEnChangeEdit6();
strtemp.Empty();
//netmask
strtemp.Format(_T("255.%d.0.0"),((int)pow(2.0,m_ipdiv.rem)-1)<<(8-m_ipdiv.rem));
m_netmask=strtemp;
OnEnChangeEdit7();
strtemp.Empty();
//fristip
strtemp.Format(_T("%d.%d.0.1/%d"),m_ippart1,(m_ippart2&(((int)pow(2.0,m_ipdiv.rem)-1)<<(8-m_ipdiv.rem))),m_ipmasknum);
m_fristip=strtemp;
OnEnChangeEdit8();
strtemp.Empty();
//lastip
strtemp.Format(_T("%d.%d.255.254/%d"),m_ippart1,((m_ippart2&(((int)pow(2.0,m_ipdiv.rem)-1)<<(8-m_ipdiv.rem)))+(int)pow(2.0,(8-m_ipdiv.rem))-1),m_ipmasknum);
m_lastip=strtemp;
OnEnChangeEdit9();
strtemp.Empty();
//brodcastip
strtemp.Format(_T("%d.%d.255.255/%d"),m_ippart1,((m_ippart2&(((int)pow(2.0,m_ipdiv.rem)-1)<<(8-m_ipdiv.rem)))+(int)pow(2.0,(8-m_ipdiv.rem))-1),m_ipmasknum);
m_brodcast=strtemp;
OnEnChangeEdit10();
strtemp.Empty();
}break;
case 2:
{ //netnumber
strtemp.Format(_T("%d.%d.%d.0/%d"),m_ippart1,m_ippart2,(m_ippart3&(((int)pow(2.0,m_ipdiv.rem)-1)<<(8-m_ipdiv.rem))),m_ipmasknum);
m_netnumber=strtemp;
OnEnChangeEdit6();
strtemp.Empty();
//netmask
strtemp.Format(_T("255.255.%d.0"),((int)pow(2.0,m_ipdiv.rem)-1)<<(8-m_ipdiv.rem));
m_netmask=strtemp;
OnEnChangeEdit7();
strtemp.Empty();
//fristip
strtemp.Format(_T("%d.%d.%d.1/%d"),m_ippart1,m_ippart2,(m_ippart3&(((int)pow(2.0,m_ipdiv.rem)-1)<<(8-m_ipdiv.rem))),m_ipmasknum);
m_fristip=strtemp;
OnEnChangeEdit8();
strtemp.Empty();
//lastip
strtemp.Format(_T("%d.%d.%d.254/%d"),m_ippart1,m_ippart2,(((m_ippart3&(((int)pow(2.0,m_ipdiv.rem)-1)<<(8-m_ipdiv.rem))))+(int)pow(2.0,(8-m_ipdiv.rem))-1),m_ipmasknum);
m_lastip=strtemp;
OnEnChangeEdit9();
strtemp.Empty();
//brodcastip
strtemp.Format(_T("%d.%d.%d.255/%d"),m_ippart1,m_ippart2,(((m_ippart3&(((int)pow(2.0,m_ipdiv.rem)-1)<<(8-m_ipdiv.rem))))+(int)pow(2.0,(8-m_ipdiv.rem))-1),m_ipmasknum);
m_brodcast=strtemp;
OnEnChangeEdit10();
strtemp.Empty();
}break;
case 3:
{//netnumber
strtemp.Format(_T("%d.%d.%d.%d/%d"),m_ippart1,m_ippart2,m_ippart3,(m_ippart4&(((int)pow(2.0,m_ipdiv.rem)-1)<<(8-m_ipdiv.rem))),m_ipmasknum);
m_netnumber=strtemp;
OnEnChangeEdit6();
strtemp.Empty();
//netmask
strtemp.Format(_T("255.255.255.%d"),((int)pow(2.0,m_ipdiv.rem)-1)<<(8-m_ipdiv.rem));
m_netmask=strtemp;
OnEnChangeEdit7();
strtemp.Empty();
//fristip
strtemp.Format(_T("%d.%d.%d.%d/%d"),m_ippart1,m_ippart2,m_ippart3,(m_ippart4&(((int)pow(2.0,m_ipdiv.rem)-1)<<(8-m_ipdiv.rem)))+1,m_ipmasknum);
m_fristip=strtemp;
OnEnChangeEdit8();
strtemp.Empty();
//lastip
strtemp.Format(_T("%d.%d.%d.254/%d"),m_ippart1,m_ippart2,m_ippart3,m_ipmasknum);
m_lastip=strtemp;
OnEnChangeEdit9();
strtemp.Empty();
//brodcastip
strtemp.Format(_T("%d.%d.%d.255/%d"),m_ippart1,m_ippart2,m_ippart3,m_ipmasknum);
m_brodcast=strtemp;
OnEnChangeEdit10();
strtemp.Empty();
}break;
case 4:
{//netnumber
strtemp.Format(_T("%d.%d.%d.%d/32"),m_ippart1,m_ippart2,m_ippart3,m_ippart4);
m_netnumber=strtemp;
OnEnChangeEdit6();
strtemp.Empty();
//netmask
strtemp.Format(_T("255.255.255.%d"),255);
m_netmask=strtemp;
OnEnChangeEdit7();
strtemp.Empty();
//fristip
strtemp.Format(_T("%d.%d.%d.%d/32"),m_ippart1,m_ippart2,m_ippart3,m_ippart4);
m_fristip=strtemp;
OnEnChangeEdit8();
strtemp.Empty();
//lastip
strtemp.Format(_T("%d.%d.%d.%d/32"),m_ippart1,m_ippart2,m_ippart3,m_ippart4);
m_lastip=strtemp;
OnEnChangeEdit9();
strtemp.Empty();
//brodcastip
strtemp.Format(_T("%d.%d.%d.%d/32"),m_ippart1,m_ippart2,m_ippart3,m_ippart4);
m_brodcast=strtemp;
OnEnChangeEdit10();
strtemp.Empty();
}break;
}
}
软件下载地址:
http://download.csdn.net/source/2791305
- IP地址CIDR斜线记法求子网信息小工具软件(vs2010+MFC)
- ip地址,子网掩码,以及cidr记法
- IP地址子网划分(CIDR)
- CIDR地址块及其子网划分(内含原始IP地址分类及其子网划分的介绍)
- CIDR地址块及其子网划分(内含原始IP地址分类及其子网划分的介绍)
- IP地址,子网掩码,子网划分,路由汇总,VLSM,CIDR
- IP地址,子网掩码,子网划分,路由汇总,VLSM,CIDR
- 【计算机网络常见面试题】超网的IP地址斜线记法
- 《用tcp/ip进行网际互联》第9章 无分类和子网地址扩展(CIDR)
- 求最小子网地址(IP Networks)
- ip地址CIDR分类
- IP地址与CIDR
- IP地址与CIDR
- IP地址、NAT、子网划分与子网掩码、CIDR等网络层相关知识整理
- TCP/IP笔记 二.网络层(1)——IP,子网,CIDR
- TCP/IP笔记 二.网络层(1)——IP,子网,CIDR
- 基础网络概念(三)TCP/IP协议、IP、Netmask、子网、CIDR、路由概念
- 计算IP地址的CIDR
- 多线程调试--日志--1
- 宏观理解Shell脚本
- 如何在 Windows CE 5.0 中开发和测试设备驱动程序
- [MIT6.828] LAB1中VBE图形界面测试总结
- MyEclipse7.5整合Flex builer3
- IP地址CIDR斜线记法求子网信息小工具软件(vs2010+MFC)
- 在Ubuntu虚拟机的Android和WinXp之间共享文件
- key value数据对于C结构的处理
- 一个正弦曲线运动轨迹
- OpenLDAP 学习笔记
- 《Linux设备驱动开发详解(第2版)》隆重出版
- 【STM32 .Net MF开发板学习-18】GPRS遥控智能小车
- 让qq和360兼容的办法
- DB 迁移到Data Guard 实施方案