如何获取局域网内其他主机的ip地址和mac地址

sallan 2010-08-31 03:15:16
大家好,最近刚开始学网络编程,写了一个简单的TCP程序,
想知道如何在局域网中获得其他主机的ip地址和mac地址
最好是有代码解读,谢谢。
...全文
1325 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
dage_01 2010-09-27
  • 打赏
  • 举报
回复
接 分
孤必有邻 2010-09-02
  • 打赏
  • 举报
回复
我的方法是:循环向每一个可能的IP发送ICMP协议包(这个还是蛮快的,一个网段只要1秒就发完了),存在的IP会回复数据包(这个过程有点慢,几十秒吧),从而知道存在的主机IP,在进一步获取MAC。
(贴点提示性代码)
——接收(一个线程)
SOCKET sock;
sock = WSASocket( AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, 0 );
if (sock==SOCKET_ERROR)
{
text.Format("WSASocket Fail: ErrCode=%d", WSAGetLastError());
pDlg->SetWindowText(text);
}
else
{
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port=0;
addr.sin_addr.s_addr=htonl(INADDR_ANY);
//Bind to a useful port.
if(bind(sock,(LPSOCKADDR)&addr,sizeof(addr))==SOCKET_ERROR)
{
closesocket(sock);
return WSAGetLastError();
}
else
{
char buf[64];
int nBytesRead;
struct sockaddr_in from;
int nFromLen = sizeof(from);
SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_HIGHEST );
while (g_bStarted)
{
nBytesRead = recvfrom(sock,buf,64,0,(struct sockaddr*)&from,&nFromLen);
if (nBytesRead == SOCKET_ERROR)
{
if (WSAGetLastError() == WSAETIMEDOUT)
{
continue;
}
sprintf(buf,"recvfrom failed: %d",WSAGetLastError());
pDlg->SetWindowText(buf);
}
else
{
// 接收成功,处理数据
IpHeader *iphdr = NULL;
IcmpHeader *icmphdr = NULL;
USHORT iphdrlen;
iphdr = (IpHeader *)buf;
iphdrlen = iphdr->h_len * 4 ; // number of 32-bit words *4 = bytes
icmphdr = (IcmpHeader*)(buf + iphdrlen);

pDlg->m_list.AddString( inet_ntoa(from.sin_addr) );
}
}
shutdown( sock, SD_SEND );
closesocket( sock );
}
}
——发送(可以是主线程)
SOCKET sock;
sock = WSASocket( AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, 0 );
for (int i=nMin, nCount=1; i<nMax && g_bStartedSend; i++)
{
for (int j=1; j<255; j++, nCount++)
{
sprintf( ip, "%d.%d.%d.%d", nFirst, nSecond, i, j );
addr=inet_addr(ip);
dest.sin_addr.s_addr=addr;
dest.sin_family=AF_INET;
// 填充数据
IcmpHeader *icmp;
icmp=(IcmpHeader*)buf;
icmp->i_type=ICMP_ECHO;
icmp->i_code=0;
icmp->i_id=(USHORT)sock;
icmp->i_cksum=0;
icmp->i_seq=0;
memset(icmp+sizeof(IcmpHeader), 'E', 32);
// 调整数据
icmp->i_cksum=0;
icmp->timestamp=GetTickCount();
icmp->i_seq=0;
icmp->i_cksum=checksum((USHORT*)icmp, datasize);
// 发送数据
if (sendto(sock, (char*)icmp, datasize, 0, (struct sockaddr*)&dest, sizeof dest) == SOCKET_ERROR)
{
text.Format("sendto fail: ErrCode=%d", WSAGetLastError());
pDlg->SetWindowText(text);
}
// 显示信息
pDlg->SetDlgItemText( IDC_EDIT1, ip );
addr = (GetTickCount()-dwStartTime+500) / 1000;
sprintf( ip, "%02d:%02d:%02d", addr/3600, (addr%3600)/60, addr%60 );
pDlg->SetDlgItemText( IDC_EDIT2, ip );
sprintf( ip, "%d", nCount);
pDlg->SetDlgItemText( IDC_EDIT3, ip );
if (!bFast) Sleep(1);
}
}
shutdown( sock, SD_SEND );
closesocket( sock );
m_tornado 2010-09-01
  • 打赏
  • 举报
回复
已经很详细了~
这不是鸭头 2010-09-01
  • 打赏
  • 举报
回复
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <iphlpapi.h>


int __cdecl main()
{
HRESULT hr;
IPAddr ipAddr;
ULONG pulMac[2];
ULONG ulLen;

ipAddr = inet_addr ("216.145.25.31");
memset (pulMac, 0xff, sizeof (pulMac));
ulLen = 6;

hr = SendARP (ipAddr, 0, pulMac, &ulLen);
printf ("Return %08x, length %8d\n", hr, ulLen);

size_t i, j;
char * szMac = new char[ulLen*3];
PBYTE pbHexMac = (PBYTE) pulMac;

//
// Convert the binary MAC address into human-readable
//
for (i = 0, j = 0; i < ulLen - 1; ++i) {
j += sprintf (szMac + j, "%02X:", pbHexMac[i]);
}

sprintf (szMac + j, "%02X", pbHexMac[i]);
printf ("MAC address %s\n", szMac);

delete [] szMac;

return 0;
}
thehunters 2010-09-01
  • 打赏
  • 举报
回复
char szDestIP[] = "192.168.0.23";

// 发送ARP请求
u_char arDestMac[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
ULONG ulLen = 6;
if(::SendARP(::inet_addr(szDestIP), 0, (ULONG*)arDestMac, &ulLen) == NO_ERROR)
{
// 打印出结果
u_char *p = arDestMac;
printf(" pEtherh->shost: %02X-%02X-%02X-%02X-%02X-%02X \n", p[0], p[1], p[2], p[3], p[4], p[5]);
}
guoxuqu 2010-09-01
  • 打赏
  • 举报
回复
学习了。
na_he 2010-09-01
  • 打赏
  • 举报
回复
获得区域网中的主机IP,只能广播的形式,相互交换IP信息。也就是每个机器上面都得有一个小程序,不断地广播自己的IP.不知道其他人还有别的高招,呵呵。
sallan 2010-09-01
  • 打赏
  • 举报
回复
感谢大家的帮助
我想向thehunters和arpnet99咨询一下
看了程序,都是由一个已知得ip地址
我想做的是通过程序得到lan中的ip地址
然后得到mac地址,请问二位高手,这应该怎么做啊
Eleven 2010-08-31
  • 打赏
  • 举报
回复
SendARP, MSDN上有例子

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧