编一个PING,一个个的PING,不就行了。

解决方案 »

  1.   


    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])
      

  2.   

    主  题:恩。主席说了。有难度
    作  者: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说的有道理。不过这几天很忙。等我有空试出来再给你加分  
      

  3.   

    如果机器上装有netbeui,那么点击“网上邻居”时发netbios的广播包,据说netbios是局域内最快的协议。
    如果没有装netbeui,而装了tcp/ip,则发ip的广播包.
    如果又装netbeui,又装了tcp/ip,则发netbios的广播包。广播包不跨router,所以,不同网段内的子机是看不到了。
    广域内看“邻居”,可能吗?也没有那个必要。