只会第一个
#include "stdafx.h"
#include <Windows.h>
#include <iphlpapi.h>#pragma comment(lib,"iphlpapi.lib")int _tmain(int argc, _TCHAR* argv[])
{
IP_ADAPTER_INFO adapter[5]; //Maximum 5 adapters DWORD buflen=sizeof(adapter); DWORD status=GetAdaptersInfo(adapter,&buflen);
BYTE s[8]; if(status==ERROR_SUCCESS)
{ PIP_ADAPTER_INFO painfo=adapter;
memcpy(s,painfo->Address,6);
printf("Physical Address:%02X-%02X-%02X-%02X-%02X-%02X\n",s[0],s[1],s[2],s[3],s[4],s[5]);
return TRUE;
}
#include "stdafx.h"
#include <Windows.h>
#include <iphlpapi.h>#pragma comment(lib,"iphlpapi.lib")int _tmain(int argc, _TCHAR* argv[])
{
IP_ADAPTER_INFO adapter[5]; //Maximum 5 adapters DWORD buflen=sizeof(adapter); DWORD status=GetAdaptersInfo(adapter,&buflen);
BYTE s[8]; if(status==ERROR_SUCCESS)
{ PIP_ADAPTER_INFO painfo=adapter;
memcpy(s,painfo->Address,6);
printf("Physical Address:%02X-%02X-%02X-%02X-%02X-%02X\n",s[0],s[1],s[2],s[3],s[4],s[5]);
return TRUE;
}
TCP/IP详解 .
#include "global.h"
#include"include/pcap.h"#pragma pack(push)
#pragma pack(1)typedef struct tagARPFrame
{
u_char8 DestMAC[6];
u_char8 SourMAC[6];
u_char8 EthType[2];
unsigned short HW_Type; /* hardware address */
unsigned short Prot_Type; /* protocol address */
unsigned char HW_Addr_Len; /* length of hardware address */
unsigned char Prot_Addr_Len; /* length of protocol address */
unsigned short Opcode; /* ARP/RARP */
unsigned char Send_HW_Addr[6]; /* sender hardware address */
unsigned char Send_Prot_Addr[4]; /* sender protocol address */
unsigned char Targ_HW_Addr[6]; /* target hardware address */
unsigned char Targ_Prot_Addr[4]; /* target protocol address */
unsigned char padding[18];
} ARPPACKET, *PARPPACKET;
#pragma pack(pop)class CSendARP
{
public:
CSendARP(const HWND hDlg);
~CSendARP(void);
BOOL Start();
void Init(const USERDATA* pUserData);
void Close();
private:
const USERDATA* m_pData;
pcap_t* m_fp;
pcap_t* m_fp2;
bool SendARP_Multiple(ARPPACKET & packet,int ip3);
bool OpenAdapter();
friend UINT WorkProc_Send(LPVOID lpParam);
friend UINT WorkProc_Recv(LPVOID lpParam);
protected:
HWND m_hDlg;
CWinThread* Thread_Send;
CWinThread* Thread_Recv;
int Continue;
int nCount;
UCHAR mac[6];
int d_ip3;
int __i;
};//////////////////////////////////////////////
#include "StdAfx.h"
#include "SendARP.h"
#include "resource.h"CSendARP::CSendARP(const HWND hDlg) : m_hDlg(hDlg)
{
m_fp=NULL;
m_fp2=NULL;
}CSendARP::~CSendARP(void)
{}bool CSendARP::OpenAdapter()
{
bpf_u_int32 netmask = 0;
char pcap_filter[100]; //filter space
struct bpf_program pcap_fp; //hold the compiled filter.
char errbuf[PCAP_ERRBUF_SIZE] = "";
//打开网卡
char* str=new char[sizeof(m_pData->nic)+sizeof("\\Device\\NPF_")];
strcpy(str,"\\Device\\NPF_");
strcat(str,m_pData->nic);
if(!(m_fp = pcap_open_live(str,// name of the device
256, // portion of the packet to capture, max 65536
0, // promiscuous mode closed
10, // read timeout
errbuf))) // error buffer
{
::SendMessage(m_hDlg, IDC_LIST_MSG, -1, (long)errbuf);
delete[] str;
return false;
}
//设置过滤器
delete[] str;
sprintf_s(pcap_filter, "ether dst %x:%x:%x:%x:%x:%x and ether proto 0x0806",
m_pData->mac[0],m_pData->mac[1],m_pData->mac[2],
m_pData->mac[3],m_pData->mac[4],m_pData->mac[5]); if (pcap_compile(m_fp, &pcap_fp, pcap_filter, 0, netmask) == -1)
return false; if (pcap_setfilter(m_fp, &pcap_fp) == -1)
return false;
return true;
}bool CSendARP::SendARP_Multiple(ARPPACKET & packet,int ip3)
{
packet.Targ_Prot_Addr[3]=ip3;
if(!pcap_sendpacket(m_fp, (UCHAR*)&packet, 60))
{
return false;
}
return true;
}UINT WorkProc_Send(LPVOID lpParam)
{
CSendARP* pTalk=(CSendARP*)lpParam;
ARPPACKET packet; memset(&packet.DestMAC,0xff,6);
memcpy(&packet.SourMAC,pTalk->m_pData->mac,6);
packet.EthType[0]=0x08;
packet.EthType[1]=0x06;
packet.HW_Type=htons(1);
packet.Prot_Type=htons(0x0800);
packet.HW_Addr_Len=0x06;
packet.Prot_Addr_Len=0x04;
packet.Opcode=htons(1);
memcpy(&packet.Send_HW_Addr,pTalk->m_pData->mac,6);
memcpy(&packet.Send_Prot_Addr,pTalk->m_pData->ip,4);
memset(&packet.Targ_HW_Addr,0,6);
memcpy(&packet.Targ_Prot_Addr,pTalk->m_pData->ip,4);
memset(&packet.padding,0,18); for(pTalk->__i=1;pTalk->__i<255;pTalk->__i++)
{
if(pTalk->__i != pTalk->m_pData->ip[3] &&
((pTalk->m_pData->ip[3] & pTalk->m_pData->Mask[3])
== (pTalk->__i & pTalk->m_pData->Mask[3]))) pTalk->SendARP_Multiple(packet,pTalk->__i);
Sleep(20);
}
return 0;
}UINT WorkProc_Recv(LPVOID lpParam)
{
CSendARP* pTalk=(CSendARP*)lpParam;
pTalk->nCount=1;
pTalk->Continue=1;
struct pcap_pkthdr *header;
const u_char *pkt_data;
int res;
DWORD dwTick, dwOldTick;
dwTick = dwOldTick = ::GetTickCount();
while(((res = pcap_next_ex( pTalk->m_fp, &header, &pkt_data)) >= 0) && pTalk->Continue)
{
if(res==0)
{
dwTick = ::GetTickCount();
if( pTalk->__i==255 && dwTick - dwOldTick > 3000)
break; //超时了,说明没有回应了
}
if(res>0)
{
dwTick = dwOldTick = ::GetTickCount();
PARPPACKET pbuf = (PARPPACKET)pkt_data;
CString str;
pTalk->nCount++;
::PostMessage(pTalk->m_hDlg,WM_MY_MSG1,2,(LPARAM)pbuf);
}
}
::SendMessage(pTalk->m_hDlg,WM_MY_MSG1,3,NULL);
return 0;
}void CSendARP::Init(const USERDATA* pUserData)
{
m_pData=pUserData;
}BOOL CSendARP::Start()
{
if(OpenAdapter())
{ Thread_Recv=AfxBeginThread(WorkProc_Recv,this);
Thread_Send=AfxBeginThread(WorkProc_Send,this);
return TRUE;
}
return FALSE;
}
void CSendARP::Close()
{
Continue=0;
if(m_fp != NULL)
pcap_close(m_fp); //关闭网卡
CString str;
str.Format("网段内当前共有活动主机%d台!",nCount);
::SendDlgItemMessage(m_hDlg,IDC_MSG_HOST,WM_SETTEXT,0,(LPARAM)(LPCTSTR)str);
}
#include <afxwin.h>
#include "global.h"
#include"include/pcap.h"#pragma pack(push)
#pragma pack(1)typedef struct tagARPFrame
{
u_char8 DestMAC[6];
u_char8 SourMAC[6];
u_char8 EthType[2];
unsigned short HW_Type; /* hardware address */
unsigned short Prot_Type; /* protocol address */
unsigned char HW_Addr_Len; /* length of hardware address */
unsigned char Prot_Addr_Len; /* length of protocol address */
unsigned short Opcode; /* ARP/RARP */
unsigned char Send_HW_Addr[6]; /* sender hardware address */
unsigned char Send_Prot_Addr[4]; /* sender protocol address */
unsigned char Targ_HW_Addr[6]; /* target hardware address */
unsigned char Targ_Prot_Addr[4]; /* target protocol address */
unsigned char padding[18];
} ARPPACKET, *PARPPACKET;
#pragma pack(pop)class CSendARP
{
public:
CSendARP(const HWND hDlg);
~CSendARP(void);
BOOL Start();
void Init(const USERDATA* pUserData);
void Close();
private:
const USERDATA* m_pData;
pcap_t* m_fp;
pcap_t* m_fp2;
bool SendARP_Multiple(ARPPACKET & packet,int ip3);
bool OpenAdapter();
friend UINT WorkProc_Send(LPVOID lpParam);
friend UINT WorkProc_Recv(LPVOID lpParam);
protected:
HWND m_hDlg;
CWinThread* Thread_Send;
CWinThread* Thread_Recv;
int Continue;
int nCount;
UCHAR mac[6];
int d_ip3;
int __i;
};//////////////////////////////////////////////#include "StdAfx.h"
#include "SendARP.h"
#include "resource.h"CSendARP::CSendARP(const HWND hDlg) : m_hDlg(hDlg)
{
m_fp=NULL;
m_fp2=NULL;
}CSendARP::~CSendARP(void)
{}bool CSendARP::OpenAdapter()
{
bpf_u_int32 netmask = 0;
char pcap_filter[100]; //filter space
struct bpf_program pcap_fp; //hold the compiled filter.
char errbuf[PCAP_ERRBUF_SIZE] = "";
//打开网卡
char* str=new char[sizeof(m_pData->nic)+sizeof("\\Device\\NPF_")];
strcpy(str,"\\Device\\NPF_");
strcat(str,m_pData->nic);
if(!(m_fp = pcap_open_live(str,// name of the device
256, // portion of the packet to capture, max 65536
0, // promiscuous mode closed
10, // read timeout
errbuf))) // error buffer
{
::SendMessage(m_hDlg, IDC_LIST_MSG, -1, (long)errbuf);
delete[] str;
return false;
}
//设置过滤器
delete[] str;
sprintf_s(pcap_filter, "ether dst %x:%x:%x:%x:%x:%x and ether proto 0x0806",
m_pData->mac[0],m_pData->mac[1],m_pData->mac[2],
m_pData->mac[3],m_pData->mac[4],m_pData->mac[5]); if (pcap_compile(m_fp, &pcap_fp, pcap_filter, 0, netmask) == -1)
return false; if (pcap_setfilter(m_fp, &pcap_fp) == -1)
return false;
return true;
}
bool CSendARP::SendARP_Multiple(ARPPACKET & packet,int ip3)
{
packet.Targ_Prot_Addr[3]=ip3;
if(!pcap_sendpacket(m_fp, (UCHAR*)&packet, 60))
{
return false;
}
return true;
}UINT WorkProc_Send(LPVOID lpParam)
{
CSendARP* pTalk=(CSendARP*)lpParam;
ARPPACKET packet; memset(&packet.DestMAC,0xff,6);
memcpy(&packet.SourMAC,pTalk->m_pData->mac,6);
packet.EthType[0]=0x08;
packet.EthType[1]=0x06;
packet.HW_Type=htons(1);
packet.Prot_Type=htons(0x0800);
packet.HW_Addr_Len=0x06;
packet.Prot_Addr_Len=0x04;
packet.Opcode=htons(1);
memcpy(&packet.Send_HW_Addr,pTalk->m_pData->mac,6);
memcpy(&packet.Send_Prot_Addr,pTalk->m_pData->ip,4);
memset(&packet.Targ_HW_Addr,0,6);
memcpy(&packet.Targ_Prot_Addr,pTalk->m_pData->ip,4);
memset(&packet.padding,0,18); for(pTalk->__i=1;pTalk->__i<255;pTalk->__i++)
{
if(pTalk->__i != pTalk->m_pData->ip[3] &&
((pTalk->m_pData->ip[3] & pTalk->m_pData->Mask[3])
== (pTalk->__i & pTalk->m_pData->Mask[3]))) pTalk->SendARP_Multiple(packet,pTalk->__i);
Sleep(20);
}
return 0;
}UINT WorkProc_Recv(LPVOID lpParam)
{
CSendARP* pTalk=(CSendARP*)lpParam;
pTalk->nCount=1;
pTalk->Continue=1;
struct pcap_pkthdr *header;
const u_char *pkt_data;
int res;
DWORD dwTick, dwOldTick;
dwTick = dwOldTick = ::GetTickCount();
while(((res = pcap_next_ex( pTalk->m_fp, &header, &pkt_data)) >= 0) && pTalk->Continue)
{
if(res==0)
{
dwTick = ::GetTickCount();
if( pTalk->__i==255 && dwTick - dwOldTick > 3000)
break; //超时了,说明没有回应了
}
if(res>0)
{
dwTick = dwOldTick = ::GetTickCount();
PARPPACKET pbuf = (PARPPACKET)pkt_data;
CString str;
pTalk->nCount++;
::PostMessage(pTalk->m_hDlg,WM_MY_MSG1,2,(LPARAM)pbuf);
}
}
::SendMessage(pTalk->m_hDlg,WM_MY_MSG1,3,NULL);
return 0;
}void CSendARP::Init(const USERDATA* pUserData)
{
m_pData=pUserData;
}BOOL CSendARP::Start()
{
if(OpenAdapter())
{ Thread_Recv=AfxBeginThread(WorkProc_Recv,this);
Thread_Send=AfxBeginThread(WorkProc_Send,this);
return TRUE;
}
return FALSE;
}
void CSendARP::Close()
{
Continue=0;
if(m_fp != NULL)
pcap_close(m_fp); //关闭网卡
CString str;
str.Format("网段内当前共有活动主机%d台!",nCount);
::SendDlgItemMessage(m_hDlg,IDC_MSG_HOST,WM_SETTEXT,0,(LPARAM)(LPCTSTR)str);
}
{ if(message == WM_MY_MSG1 )
{
switch((int)wParam)
{
case 2:
PARPPACKET pbuf = (PARPPACKET)(LPVOID)lParam;
CString str1,str2;
str1.Format("%d.%d.%d.%d",pbuf->Send_Prot_Addr[0],
pbuf->Send_Prot_Addr[1],
pbuf->Send_Prot_Addr[2],
pbuf->Send_Prot_Addr[3]);
str2.Format("%02X-%02X-%02X-%02X-%02X-%02X", pbuf->Send_HW_Addr[0],
pbuf->Send_HW_Addr[1],
pbuf->Send_HW_Addr[2],
pbuf->Send_HW_Addr[3],
pbuf->Send_HW_Addr[4],
pbuf->Send_HW_Addr[5]); m_ListCtrl.InsertItem(count,str1);
m_ListCtrl.SetItemText(count,1,str2);
count++;
break; }
}
return CDialog::WindowProc(message, wParam, lParam);
}
ncb ncb;
uchar uretcode;
int num = 0;
lana_enum lana_enum;
memset(&ncb, 0, sizeof(ncb) );
ncb.ncb_command = ncbenum;
ncb.ncb_buffer = (unsigned char *)&lana_enum;
ncb.ncb_length = sizeof(lana_enum);
//向网卡发送ncbenum命令,以获取当前机器的网卡信息,如有多少个网卡
//每张网卡的编号等
uretcode = netbios(&ncb);
if (uretcode == 0)
{
num = lana_enum.length;
//对每一张网卡,以其网卡编号为输入编号,获取其mac地址
for (int i = 0; i < num; i++)
{
astat adapter;
if(getaddressbyindex(lana_enum.lana[i],adapter) == 0)
{
pmacaddr[i].b1 = adapter.adapt.adapter_address[0];
pmacaddr[i].b2 = adapter.adapt.adapter_address[1];
pmacaddr[i].b3 = adapter.adapt.adapter_address[2];
pmacaddr[i].b4 = adapter.adapt.adapter_address[3];
pmacaddr[i].b5 = adapter.adapt.adapter_address[4];
pmacaddr[i].b6 = adapter.adapt.adapter_address[5];
}
}
}