#include <stdio.h>
#include <WinSock2.h>
#include "IPHlpApi.h"
#include <tchar.h>
#include <malloc.h>
#pragma comment(lib,"Iphlpapi.lib")
#pragma comment(lib,"ws2_32.lib")
//探测局域网活动主机
int _tmain(int argc, _TCHAR* argv[])//_tmain为了支持unicode所使用的main一个别名而已,高版本的微软VC 编译器才有的
{
ULONG dwSize=0,dwRetVal=0;
ULONG uNo=0;
HRESULT hr;
IPAddr ipAddr;
IN_ADDR m_Addr;
MIB_IPADDRTABLE* pIPAddrTable=(MIB_IPADDRTABLE*)malloc(sizeof(MIB_IPADDRTABLE));
if(GetIpAddrTable(pIPAddrTable,&dwSize,0)==ERROR_INSUFFICIENT_BUFFER)
{
free(pIPAddrTable);
pIPAddrTable=(MIB_IPADDRTABLE*)malloc(dwSize);
}
if((dwRetVal=GetIpAddrTable(pIPAddrTable,&dwSize,0)==NO_ERROR))
{
int k=0;
for(k = 0; k < (int)pIPAddrTable->dwNumEntries; k++)
{
m_Addr.S_un.S_addr = (unsigned long)pIPAddrTable->table[k].dwAddr;
printf("本机IP地址:%s\n", inet_ntoa(m_Addr));
m_Addr.S_un.S_addr = (unsigned long)pIPAddrTable->table[k].dwMask;
printf("子网 mask :%s\n\n",inet_ntoa(m_Addr));
}
printf("开始探测活动主机:\n");
ULONG ulHostIp=ntohl(pIPAddrTable->table[0].dwAddr);
ULONG ulHostMask=ntohl(pIPAddrTable->table[0].dwMask);
for(ULONG i=0;i<(~ulHostMask);i++)
{
BYTE pulMac[6];//BYTE=unsigned char;
ULONG ulLen=sizeof(pulMac);
memset(pulMac,0xff,sizeof(pulMac));
ipAddr=htonl(i+(ulHostIp&ulHostMask));
BYTE* strIpAddr=(BYTE*)(&ipAddr);
printf("i=%d/%d,test IP ADDRESS %d.%d.%d.%d\n",i,(~ulHostMask),strIpAddr[0],strIpAddr[1],strIpAddr[2],strIpAddr[3]);
hr=SendARP(ipAddr,0,(unsigned long*)pulMac,&ulLen);
if(ulLen==6)
{
uNo++;
PBYTE pbHexMac=(PBYTE) pulMac;
printf(" active,%2d:MAC ADDRESS %02X-%02X-%2X-%02X-%02X-%02X;IP ADDRESS %d.%d.%d.%d\n",
uNo,pulMac[0],pulMac[1],pulMac[2],pulMac[3],pulMac[4],pulMac[5],
strIpAddr[0],strIpAddr[1],strIpAddr[2],strIpAddr[3]);
}
}
}
else
{
printf("Call to GetIpAddrTable failed.\n");
}
free(pIPAddrTable);
printf("OVER!\n");
getchar();
return 0;
}
/*
//获得本机mac地址
#include<Winsock2.h>
#include "Iphlpapi.h"
#include<iostream>
#include<tchar.h>
#include<conio.h>
#pragma comment(lib,"Iphlpapi.lib")
#pragma comment(lib,"ws2_32.lib")
int _tmain(int argc,_TCHAR* argv[])
{
PIP_ADAPTER_INFO pAdapterInfo;
PIP_ADAPTER_INFO pAdapter=NULL;
DWORD dwRetVal=0;
pAdapterInfo=(IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO));//IP_ADAPTER_INFO结构体指针存储本机网卡信息
ULONG ulOutBufLen=sizeof(IP_ADAPTER_INFO);//得到结构体大小,用于GetAdaptersInfo参数
dwRetVal=GetAdaptersInfo(pAdapterInfo,&ulOutBufLen);//获得网络接口信息列表,其中ulOutBufLen参数既是一个输入量也是一个输出量
if(dwRetVal==ERROR_BUFFER_OVERFLOW)
{ //如果函数返回的是ERROR_BUFFER_OVERFLOW则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
//这也是说明为什么stSize既是一个输入量也是一个输出量
free(pAdapterInfo);//释放原来的内存空间
pAdapterInfo=(IP_ADAPTER_INFO*)malloc(ulOutBufLen);//重新申请内存空间用来存储所有网卡信息
dwRetVal=GetAdaptersInfo(pAdapterInfo,&ulOutBufLen);//再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
}
if(dwRetVal==NO_ERROR)
{
pAdapter=pAdapterInfo;
while(pAdapter) //可能有多网卡,因此通过循环去打印网络接口信息各项内容
{
printf("Adapter Name:%s\n",pAdapter->AdapterName);
printf("Adapter Desc:%s\n",pAdapter->Description);
printf("MAC Addr:%02x:%02x:%02x:%02x:%02x:%02x\n",
pAdapter->Address[0], pAdapter->Address[1],
pAdapter->Address[2], pAdapter->Address[3],
pAdapter->Address[4], pAdapter->Address[5]);
printf("IP Address:%s\n",pAdapter->IpAddressList.IpAddress.String);
printf("IP Mask:%s\n",pAdapter->IpAddressList.IpMask.String);
printf("Gateway:%s\n",pAdapter->GatewayList.IpAddress.String);
if(pAdapter->DhcpEnabled)
{
printf("DHCP Enabled:Yes\n");
printf("DHCP Server:%s\n",pAdapter->DhcpServer.IpAddress.String);
printf("Lease Obtained:%ld\n",pAdapter->LeaseObtained);
}
else
{
printf("DHCP Enabled:No\n");
}
if(pAdapter->HaveWins)
{
printf("Have Wins: Yes\n");
printf("Primary Wins Server:%s\n",pAdapter->PrimaryWinsServer.IpAddress.String);
printf("Secondary Wins Server:%s\n",pAdapter->SecondaryWinsServer.IpAddress.String);
}
else
{
printf("Have Wins: No\n");
}
printf("***********************************\n");
pAdapter=pAdapter->Next;
}
}
else
{
printf("Call to GetAdaptersInfo failed.\n");
}
if(pAdapterInfo)
{
free(pAdapterInfo);//释放内存空间
}
getch();
return 0;
}
*/