发送一个.255的ICMP广播包,所有本网段的机器都会回复给你

解决方案 »

  1.   

    获得IP和主机名的
    BOOL CMyApp::GetLocalNetWorkInfo()
    {
      HKEY    hKey;
      DWORD    dwDataType;
      DWORD    dwLength;
      LONG    lRet;  // 读取注册表中的网络信息
      lRet = ::RegOpenKeyEx( HKEY_LOCAL_MACHINE, (LPCTSTR)gcszNetWorkRegKey, 0, KEY_READ, &hKey );
      if( lRet != ERROR_SUCCESS ) {
        AfxMessageBox( IDS_INIT_ERROR_1, MB_OK ¦ MB_ICONSTOP );
        return FALSE;
      }  // 得到"工作组"名
      dwLength = 50;
      lRet = ::RegQueryValueEx( hKey, gcszWorkGroup, NULL, &dwDataType,  (LPBYTE)m_szWorkGroup, &dwLength );
      if( lRet != ERROR_SUCCESS ) {
        AfxMessageBox( IDS_INIT_ERROR_1, MB_OK ¦ MB_ICONSTOP );
        return FALSE;
      }  // 得到"计算机"名
      dwLength = 50;
      lRet = ::RegQueryValueEx( hKey, gcszComputerName, NULL, &dwDataType, (LPBYTE)m_szComputerName,  &dwLength );
      if( lRet != ERROR_SUCCESS ) {
        AfxMessageBox( IDS_INIT_ERROR_1, MB_OK ¦ MB_ICONSTOP );
        return FALSE;
      }  lRet = ::RegCloseKey( hKey );
      if( lRet != ERROR_SUCCESS ) {
        AfxMessageBox( IDS_INIT_ERROR_1, MB_OK ¦ MB_ICONSTOP );
        return FALSE;
      }  // 递归搜索"网络邻居"的层次树, 并填充到 m_InfoNetHood
      if( !EnumerateNetHood( (LPNETRESOURCE)NULL ) )
        return FALSE;
      m_timePrev = CTime::GetCurrentTime();  return TRUE;
    }
    BOOL CMyApp::EnumerateNetHood( LPNETRESOURCE lpnr )

      DWORD dwRet, dwRetEnum;
      HANDLE hEnum; 
      DWORD cbBuffer = 16384;
      DWORD cEntries = 0xFFFFFFFF;
      LPNETRESOURCE lpnrLocal;
      DWORD i;  CString str;
      int  nLevel = -1;
      CString strDisplayName;
      CString strTrueName;
      
      dwRet = WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, lpnr, &hEnum );
      if( dwRet == WN_FUNCTION_BUSY ¦¦ dwRet == ERROR_BAD_NET_NAME )
        return TRUE;  if( dwRet != NO_ERROR ) { 
        NetErrorMessageBox( dwRet, "WNetOpenEnum" );
            return FALSE;
      }
      
      do {
        lpnrLocal = (LPNETRESOURCE)GlobalAlloc( GPTR, cbBuffer );
        dwRetEnum = WNetEnumResource( hEnum, &cEntries, lpnrLocal, &cbBuffer);
        if( dwRetEnum == NO_ERROR) {
          for( i = 0; i < cEntries; i++ ) {
            
            // 只搜索网络提供者为"Microsoft Network"的资源
            str="Microsoft Network";
            int nCmpNo = lstrcmpi( (LPCTSTR)lpnrLocal[i].lpProvider, (LPCTSTR)str );
            if( nCmpNo )
              continue;        // 只包括 Container 资源, 共享磁盘、打印机不具有 RESOURCEUSAGE_CONTAINER 属性
            if( RESOURCEUSAGE_CONTAINER == 
              ( lpnrLocal[i].dwUsage & RESOURCEUSAGE_CONTAINER ) ) {
              
              nLevel = -1;
              switch( lpnrLocal[i].dwDisplayType ) {
                case RESOURCEDISPLAYTYPE_NETWORK:    // 整个网络
                  nLevel = 0;
                  strDisplayName.LoadString( IDS_ENTIRNET );
                  strTrueName = "*";
                  break;
                case RESOURCEDISPLAYTYPE_DOMAIN:    // 工作组
                  nLevel = 1;
                  strTrueName.LoadString( IDS_WORKGROUP );
                  strDisplayName.Format( "%s%s", lpnrLocal[i].lpRemoteName, strTrueName );
                  strTrueName = lpnrLocal[i].lpRemoteName;
                  break;
                case RESOURCEDISPLAYTYPE_SERVER:    // 计算机
                  nLevel = 2;
                  // 加 2 是为去掉前缀"//"
                  strDisplayName.Format( "%s", lpnrLocal[i].lpRemoteName + 2 );
                  strTrueName = strDisplayName;
                  break;
              }
              ASSERT( nLevel != -1 );
              NewInfoNetHood( nLevel, strTrueName, strDisplayName );          if( !EnumerateNetHood( &lpnrLocal[i] ) ) 
                return FALSE;
            }
                }
        }
        else
          if( dwRetEnum != ERROR_NO_MORE_ITEMS ) {
            NetErrorMessageBox( dwRetEnum, "WNetEnumResource" );
            return FALSE;
          }
      } 
        while( dwRetEnum != ERROR_NO_MORE_ITEMS );
        
      GlobalFree( (HGLOBAL)lpnrLocal );
      dwRet = WNetCloseEnum( hEnum );
      if( dwRet != NO_ERROR ) {
        NetErrorMessageBox( dwRet, "WNetCloseEnum" );
        return FALSE;
      }
      
      return TRUE;
    }  
      

  2.   

    我从我的类中改写了一段,我也没调试,估计问题不大,如果有问题,在联系我。
    先取所有的网络的资源,再取主机的名字,在取IP.
    /*********************************************
     *
     * Write by Databind 2001-05-17
     *
     *********************************************/struct hostinfo{
    char szHostName[255];
    char szIp[17];

    };
    CList<CString,CString&> m_HostNameList;
    hostinfo * m_pHostInfos = NULL;
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
      wVersionRequested = MAKEWORD( 2, 2 );
      err = WSAStartup( wVersionRequested, &wsaData );
    NETRESOURCE * pNetRC = NULL;
    Enumerate(pNetRC); 
    int nMachine = m_HostNameList.GetCount();
    m_pHostInfos = new hostinfo[nMachine];
    memset(m_pHostInfos,0,sizeof(hostinfo)*nMachine);
    if(nMachine)
    {
    for(int i = 0;i < nMachine; i++)
    {
    CString csMachineName = m_HostNameList.GetAt(m_HostNameList.FindIndex(i));
    memcpy(m_pHostInfos[i].szHostName,
    csMachineName,
    csMachineName.GetLength()); 
    CString csIP = GetIPbyHostName(csMachineName);
    memcpy(m_pHostInfos[i].szIP,
    csIP,
    csIP.GetLength()); 

    }

    }
    BOOL Enumerate(LPNETRESOURCE lpNetRC)
    {
    DWORD dwScope = RESOURCE_GLOBALNET ;
    DWORD dwType = RESOURCETYPE_ANY ;
    HANDLE hNet = 0;
    DWORD dwResult = WNetOpenEnum(dwScope,dwType,0,lpNetRC, &hNet) ;
    if( dwResult != NO_ERROR )
    return FALSE;
    DWORD dwBuffer = 16*1024 ; // 16K is reasonable size
    DWORD dwEntries = 0xFFFFFFFF ; // enumerate all possible entries
    LPNETRESOURCE lpnrLocal = 0;
    BOOL bRet = TRUE;
    do
    {
    lpnrLocal = (LPNETRESOURCE) GlobalAlloc( GPTR, dwBuffer ) ; dwResult = WNetEnumResource(hNet,&dwEntries,lpnrLocal,&dwBuffer) ; if( dwResult == NO_ERROR )
    {
    for( DWORD i = 0 ; i < dwEntries ; i++ )
    {
    CString nsname;
    nsname = lpnrLocal[i].lpRemoteName;
    if(lpnrLocal[i].dwDisplayType == RESOURCEDISPLAYTYPE_SERVER)
    {
    nsname=nsname.Right(nsname.GetLength()-2);
    m_HostNameList.AddTail(nsname); 
    } if( RESOURCEUSAGE_CONTAINER ==(lpnrLocal[i].dwUsage & RESOURCEUSAGE_CONTAINER) &&
    lpnrLocal[i].dwDisplayType != RESOURCEDISPLAYTYPE_SERVER ) 
    if( !Enumerate(&lpnrLocal[i]))
    return FALSE;
    }

    else if( dwResult != ERROR_NO_MORE_ITEMS ) 
    return FALSE;
    } while( dwResult != ERROR_NO_MORE_ITEMS ); if( lpnrLocal )
    GlobalFree((HGLOBAL) lpnrLocal) ;
    WNetCloseEnum(hNet) ;
    return bRet;}
    CString GetIPbyHostName(CString csHostName)
    {
    if(csHostName == "")
    return "";
    hostent *Me_Info;
    Me_Info=::gethostbyname(csHostName);
    DWORD a ;
    a = WSAGetLastError();
    CString csIP;
    if(!Me_Info)
    return "";
    csIP = ::inet_ntoa(*(struct in_addr*)Me_Info->h_addr_list[0]);
    return csIP;
    }