C++获取局域网内所有活动的主机Ip和名称

jingyukxy 2008-10-15 01:15:46
如题
  如果能用Java实现也可以
...全文
1491 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lbzhao_28 2008-10-16
  • 打赏
  • 举报
回复
ping的方法太慢了.
arp倒是可以的.

楼主是要在什么OS中实现?

我在linux的底层做过类似的东西,建立一个arp的地址链表.
帅得不敢出门 2008-10-15
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20040707/15/3153479.html

线程函数
DWORD WINAPI ArpThread(LPVOID lParam)
{
char * szIp=(char *)lParam;
ULONG pMac[2];
ULONG pulen=6;
int ret;
if ((ret=SendARP(inet_addr(szIp),0,pMac,&pulen))==0)
{
PBYTE pbyte=(PBYTE)pMac;
for (int i=0;i<5;i++)
{
TRACE("%02X-",pbyte[i]);
}
TRACE("%02X",pbyte[5]);

}
else
{
TRACE("SendARP Error %d",ret);
}
return 0;
}

开多线程调用
void CTestArpDlg::OnButton1()
{
// TODO: Add your control notification handler code here
HANDLE hthread[255];
CString IpSuffix="192.168.10.";
CString strIp;
for (int i=0;i<255;i++)
{
strIp.Format("%d",i+1);
strIp=IpSuffix+strIp;
hthread[i]=CreateThread(NULL,0,ArpThread,strIp.GetBuffer(0),0,NULL);
}
WaitForMultipleObjects(255,hthread,TRUE,INFINITE);

}
帅得不敢出门 2008-10-15
  • 打赏
  • 举报
回复
arp包 一个个主机发过去
感觉这个比较实用点,其他的几个貌似只能查一个域里的
study_live 2008-10-15
  • 打赏
  • 举报
回复

#include <windows.h>
#include <Winnetwk.h>
#include <stdio.h>
#pragma comment(lib, "Ws2_32.lib")
#pragma comment(lib, "Mpr.lib")

BOOL GetIpAddress(char *hostname)
{
HOSTENT *lpHost=NULL;
struct sockaddr_in dest;

lpHost = gethostbyname(hostname);
if (lpHost == NULL)
{
printf("gethostbyname failed: %d", WSAGetLastError());
}
else
{
for(int i=0; lpHost->h_addr_list[i] != NULL ;i++)
{
memcpy(&(dest.sin_addr), lpHost->h_addr_list[i],
lpHost->h_length);
printf("IP address is: %s",
inet_ntoa(dest.sin_addr));
}

}
return TRUE;
}
BOOL WINAPI EnumerateFunc (LPNETRESOURCE lpnr)
{
HANDLE hEnum;
DWORD dwIndex, dwResult, dwBufferSize = 16384, dwNumEntries = 0xFFFFFFFF; // Enumerate all possible entries.
LPNETRESOURCE lpnrLocal; // Pointer to enumerated structures.

dwResult = WNetOpenEnum (
RESOURCE_GLOBALNET, // All resources on the network
RESOURCETYPE_ANY, // All resources
0, // Enumerate all resources.
lpnr, // The container to enumerate
&hEnum); // Handle to resource
if (dwResult != ERROR_SUCCESS)
return FALSE;

// Allocate memory for NETRESOURCE structures.
if (!(lpnrLocal = (LPNETRESOURCE) LocalAlloc (LPTR, dwBufferSize)))
printf("Not enough memory");

do
{
dwResult = WNetEnumResource (
hEnum, // Resource handle
&dwNumEntries, // Number of entries
lpnrLocal, // LPNETRESOURCE
&dwBufferSize); // Buffer size

if (dwResult == ERROR_SUCCESS)
{
for (dwIndex = 0; dwIndex < dwNumEntries; dwIndex++)
{
printf("\nRemote Name:%s Comment: %s", lpnrLocal[dwIndex].lpRemoteName,
lpnrLocal[dwIndex].lpComment);
GetIpAddress(lpnrLocal[dwIndex].lpRemoteName+2);

}
}
else if (dwResult != ERROR_NO_MORE_ITEMS)
break;
}
while(dwResult != ERROR_NO_MORE_ITEMS);
LocalFree (lpnrLocal);
WNetCloseEnum (hEnum);
return TRUE;
}

int main(int argc, char* argv[])
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err == 0 )
{
NETRESOURCE nr;
nr.dwScope = RESOURCE_GLOBALNET;
nr.dwType = RESOURCETYPE_DISK;
nr.dwUsage = RESOURCEUSAGE_CONTAINER;
nr.lpLocalName = TEXT("");
nr.lpRemoteName = TEXT("MyDomain");//这里改为你的域名
nr.lpComment = TEXT("");
nr.lpProvider = TEXT("");
EnumerateFunc (&nr);
}
return 0;
}

herman~~ 2008-10-15
  • 打赏
  • 举报
回复
arp包 ,对了TCP/IP详解你们有提到...
差点忘记了,看来需要复习下 TCP/IP详解了
redleaves 2008-10-15
  • 打赏
  • 举报
回复
2:arp欺骗,,(完了记得改回来。。)
不一定非要欺骗,只要发个ARP包,告诉大家有新主机加入,别的主机就会发ARP给你说它的地址...
还可以做网络监听,分析所有过往包的信息...
xf_pan 2008-10-15
  • 打赏
  • 举报
回复
1:通过ping命令,检测当前活动主机。
2:arp欺骗,,(完了记得改回来。。)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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