怎样才能搜索出 LAN 中所有在线的机器名及 IP 地址 编一个PING,一个个的PING,不就行了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 NET_API_STATUS NetLocalGroupGetMembers( LPCWSTR servername, LPCWSTR localgroupname, DWORD level, LPBYTE *bufptr, DWORD prefmaxlen, LPDWORD entriesread, LPDWORD totalentries, PDWORD_PTR resumehandle );hostent *m_Info;m_Info=::gethostbyname(membername);IPAddress=::inet_ntoa(*(struct in_addr*)m_Info->h_addr_list[0]) 主 题:恩。主席说了。有难度作 者:hatname所属论坛:Visual C++问题点数:100回复次数:7人气指数:304发表时间:2000-11-18 12:20:00 我想编一个在已知网络上。列出主机和IP地址的程序。我现在是这样做的。 给出子网。然后对每个IP地址用GETHOSTBYADDR, 虽然能够实现。但是相当慢。把IP地址分段查找有点快。但是还是慢。 不知道各位有什么高见。 网上邻居上是怎么实现的? 另外怎样知道XX机的工作组、域? 我的代码如下void CRiverfindDlg::OnButton1() { this->UpdateData(); DWORD IP[5]; m_ip.GetAddress(IP[0]); IP[0]&=0XFFFFFF00; IP[1]=IP[0]+50; IP[2]=IP[1]+50; IP[3]=IP[2]+50; IP[4]=IP[3]+50; ::AfxBeginThread(FIND,(LPVOID)&IP[0]); ::AfxBeginThread(FIND,(LPVOID)&IP[1]); ::AfxBeginThread(FIND,(LPVOID)&IP[2]); ::AfxBeginThread(FIND,(LPVOID)&IP[3]); ::AfxBeginThread(FIND,(LPVOID)&IP[4]);}UINT FIND(LPVOID P){ CRiverfindApp *app; app=(CRiverfindApp *)::AfxGetApp(); hostent *host; DWORD IP; IP=*(DWORD *)P; in_addr a; CString str; int i; if((int)(IP&0XFF)<200) i=(int)(IP&0XFF)+50; else i=254; while((int)(IP&0XFF)<i){ IP++; a.S_un.S_addr=::htonl(IP); host=::gethostbyaddr((char *)&a,sizeof(a),AF_INET); if(host==NULL) continue; str.Empty(); str.Format("%s<:=:>%s",host->h_name,inet_ntoa(a)); app->list.Lock(); app->m_list.AddString(str); app->list.Unlock(); } return 1;} 转移贴子到 Visual C++ Visual Basic Delphi C/C++ C++ Builder ASM 数据库开发 PowerBuilder ActiveX/COM 数据算法 软件工程 图形/游戏/多媒体 安全技术 网络/通讯 技术书籍 文件格式 C# XML 主页制作 图形处理 ASP PHP Perl Java Javascript JSP 软件使用 资源使用 软件注册 我看软件 寻找软件 行业软件 软件评测 Windows 95/98 Windows NT/2000 DOS Linux/Unix 硬件指南 程序人生 软件市场 程序员考试 人才热线 建议和意见 灌水乐园 走向海外 | 加到精华区 回复贴子: zzh回复于2000-11-18 12:32:00 得0分 gethostbyaddr函数在该主机不存在时调用速度非常慢。 alphagx回复于2000-11-18 12:37:00 得0分 可以用列举网络资源来实现 具体函数为WNetOpenEnum,WNetEnumResource,你去查阅一下MSDN吧 hatname回复于2000-11-18 12:37:00 得0分 我知道。所以才是问题啊? wuxin回复于2000-11-19 20:56:00 得0分 alophagx说的对,应该用枚举函数.否则按你的算法,可以把全世界所有的主机都找出来了,速度当然 慢了。 hatname回复于2000-11-20 10:15:00 得0分 不要MFC呢?假使我要在LINUX下呢? mutant回复于2000-11-21 8:43:00 得100分 局域网上可以用广播,看那些IP有回应就可以了广域网暂时没想到办法 hatname回复于2000-11-22 9:07:00 得0分 mutant说的有道理。不过这几天很忙。等我有空试出来再给你加分 如果机器上装有netbeui,那么点击“网上邻居”时发netbios的广播包,据说netbios是局域内最快的协议。如果没有装netbeui,而装了tcp/ip,则发ip的广播包.如果又装netbeui,又装了tcp/ip,则发netbios的广播包。广播包不跨router,所以,不同网段内的子机是看不到了。广域内看“邻居”,可能吗?也没有那个必要。 求助:消息映射问题 默认按键的消息循环? QQ消息发送机 关于自画椭圆按钮问题!高手进 请问VC里,RC文件中的资源大小是以什么为单位的? 一个小问题:vc.net中怎样添加消息处理函数 新手提问:CStringArray m_saILevelName;是什么意思啊 谁有关于“分布式入侵检测系统的研究与实现 ”这方面的资料,能不能帮我找一下,急用! 谁能给我一段ISAPI中实现查询数据分页的源代码!!!高分80!! 如何在win2000中屏蔽ctrl+alt+del键? 关于用API函数SHGetDesktopFolder得到桌面的目录 !!!!!!!请高手请点迷津!!!!!!!!
NET_API_STATUS NetLocalGroupGetMembers(
LPCWSTR servername,
LPCWSTR localgroupname,
DWORD level,
LPBYTE *bufptr,
DWORD prefmaxlen,
LPDWORD entriesread,
LPDWORD totalentries,
PDWORD_PTR resumehandle
);hostent *m_Info;
m_Info=::gethostbyname(membername);
IPAddress=::inet_ntoa(*(struct in_addr*)m_Info->h_addr_list[0])
作 者:hatname
所属论坛:Visual C++
问题点数:100
回复次数:7
人气指数:304
发表时间:2000-11-18 12:20:00
我想编一个在已知网络上。列出主机和IP地址的程序。我现在是这样做的。
给出子网。然后对每个IP地址用GETHOSTBYADDR,
虽然能够实现。但是相当慢。把IP地址分段查找有点快。但是还是慢。
不知道各位有什么高见。
网上邻居上是怎么实现的?
另外怎样知道XX机的工作组、域?
我的代码如下
void CRiverfindDlg::OnButton1()
{
this->UpdateData();
DWORD IP[5];
m_ip.GetAddress(IP[0]);
IP[0]&=0XFFFFFF00;
IP[1]=IP[0]+50;
IP[2]=IP[1]+50;
IP[3]=IP[2]+50;
IP[4]=IP[3]+50;
::AfxBeginThread(FIND,(LPVOID)&IP[0]);
::AfxBeginThread(FIND,(LPVOID)&IP[1]);
::AfxBeginThread(FIND,(LPVOID)&IP[2]);
::AfxBeginThread(FIND,(LPVOID)&IP[3]);
::AfxBeginThread(FIND,(LPVOID)&IP[4]);
}
UINT FIND(LPVOID P)
{
CRiverfindApp *app;
app=(CRiverfindApp *)::AfxGetApp();
hostent *host;
DWORD IP;
IP=*(DWORD *)P;
in_addr a;
CString str;
int i;
if((int)(IP&0XFF)<200)
i=(int)(IP&0XFF)+50;
else
i=254;
while((int)(IP&0XFF)<i){
IP++;
a.S_un.S_addr=::htonl(IP);
host=::gethostbyaddr((char *)&a,sizeof(a),AF_INET);
if(host==NULL)
continue;
str.Empty();
str.Format("%s<:=:>%s",host->h_name,inet_ntoa(a));
app->list.Lock();
app->m_list.AddString(str);
app->list.Unlock();
}
return 1;
} 转移贴子到 Visual C++ Visual Basic Delphi C/C++ C++ Builder ASM 数据库开发 PowerBuilder ActiveX/COM 数据算法 软件工程 图形/游戏/多媒体 安全技术 网络/通讯 技术书籍 文件格式 C# XML 主页制作 图形处理 ASP PHP Perl Java Javascript JSP 软件使用 资源使用 软件注册 我看软件 寻找软件 行业软件 软件评测 Windows 95/98 Windows NT/2000 DOS Linux/Unix 硬件指南 程序人生 软件市场 程序员考试 人才热线 建议和意见 灌水乐园 走向海外 | 加到精华区
回复贴子:
zzh回复于2000-11-18 12:32:00 得0分
gethostbyaddr函数在该主机不存在时调用速度非常慢。
alphagx回复于2000-11-18 12:37:00 得0分
可以用列举网络资源来实现 具体函数为WNetOpenEnum,WNetEnumResource,你去查阅一下
MSDN吧
hatname回复于2000-11-18 12:37:00 得0分
我知道。所以才是问题啊?
wuxin回复于2000-11-19 20:56:00 得0分
alophagx说的对,应该用枚举函数.
否则按你的算法,可以把全世界所有的主机都找出来了,速度当然 慢了。
hatname回复于2000-11-20 10:15:00 得0分
不要MFC呢?假使我要在LINUX下呢?
mutant回复于2000-11-21 8:43:00 得100分
局域网上可以用广播,看那些IP有回应就可以了
广域网暂时没想到办法
hatname回复于2000-11-22 9:07:00 得0分
mutant说的有道理。不过这几天很忙。等我有空试出来再给你加分
如果没有装netbeui,而装了tcp/ip,则发ip的广播包.
如果又装netbeui,又装了tcp/ip,则发netbios的广播包。广播包不跨router,所以,不同网段内的子机是看不到了。
广域内看“邻居”,可能吗?也没有那个必要。