-
问题内容:求获取DHCP已分配的IP
- 原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=5659641
- 所属论坛:网络编程
审核组:VC/MFC
- 提问者:astair
解决者:neosu
- 感谢:loverx neosu
- 关键字:VC/MFC 网络编程
- 答案:
小妹欲编写一个运行在Windows Server 2003上的VC程序,用于获取该DHCP服务器启动后分配给客户端的IP地址(有哪些IP被使用)。
请各位大侠多多帮忙,最好有源码,先在此谢过!
---------------------------------------------------------------
大概的步骤如下
1.获得子网掩码和gateway IP地址
2.AND操作获得局域网IP启示段,OR操作获得最大范围
3.向这个区域的每个IP,发送ARP(地址解析协议),获得的计算机会返回给你消息
4.至于如何发送ARP,window下面提供了SendARP interface,也可以使用第3方 driver
根据这个流程,对应google搜集资料,可以实现
---------------------------------------------------------------
先用
DhcpEnumSubnets 枚举子网, 会有很多。
wchar_t wcIP[255];
//把dhcp主机的IP放在wcIP中
DHCP_RESUME_HANDLE hResumeHandle = 0;
DWORD PrefMax = 255;//预计的最大租约个数
DWORD dwRead;
DWORD dwTotal;
LPDHCP_IP_ARRAY IPArray = NULL;
DWORD dwRet ;
dwRet = DhcpEnumSubnets(wcIP, &hResumeHandle, PrefMax, &IPArray , &dwRead, &dwTotal);
然后在子网的基础上, 用DhcpEnumSubnetClients枚举租约
for (DWORD i = 0; i < dwRead; i ++)
{
DWORD ip = IPArray->Elements[i];//子网地址
//str.Format("(%d) IP = %s\n", i, IP2Str(htonl(ip)));
//AfxMessageBox(str);
DHCP_RESUME_HANDLE hRH = 0;
LPDHCP_CLIENT_INFO_ARRAY clientArray = NULL;
DWORD PrefMaxClient = 65535;
DWORD ClientsRead, ClientsTotal;
DhcpEnumSubnetClients(wcIP, ip, &hRH, PrefMaxClient, &clientArray,&ClientsRead, &ClientsTotal);
for (DWORD j = 0; j < ClientsRead; j ++)
{
//输出客户地址
DHCP_IP_ADDRESS clientIP = clientArray->Clients[j]->ClientIpAddress;
//这个是主机机名, 宽字串的:clientArray->Clients[j]->ClientName
//MAC地址:一般是6个 clientArray->Clients[j]->ClientHardwareAddress->Data
}
}
}
- 评价:
给朵鲜花(8)
扔个鸡蛋(2)