我已经搜索到局域网内所有的计算机名,怎么得到这些机器对应的IP地址,注意:局域网内的有的机器是多网卡的或者是单网卡但多IP的,要求是能根据计算机名得到该机器的所有IP地址,就是说现在已经得到了局域网的所有计算机名,怎么得到每个机器的所有IP地址?

解决方案 »

  1.   

    1.gethostbyname()
    2. 转换结果去ip_addr
    3.ip_addr 有一个指针的指针(所有ip here!)
      

  2.   

    To:jiangsheng
    没办法,如果我不这样写标题,大家一看内容就不来了,以前我问的问题一般都解决不了,所以就先把各位DX吸引过来再说了,这个问题由于我没环境,所以正如joymaoyong所说的我早就已经这么写了,但不知道对不对,先写好Code再测试一下,jiangshengDX看看下面我写的对不?谢谢了。
    m_list.ResetContent();
    CString strTemp; 
    struct hostent *host;
    struct in_addr *ptr; // 获得IP地址  
     
    DWORD dwScope = RESOURCE_CONTEXT;
    NETRESOURCE *NetResource = NULL;
    HANDLE hEnum;
    WNetOpenEnum( dwScope, NULL, NULL, NULL, &hEnum ); WSADATA wsaData;
    //开始枚举网络资源
    WSAStartup(MAKEWORD(1,1),&wsaData); if ( hEnum )     //如果句柄有效
    {
    DWORD Count = 0xFFFFFFFF;
    DWORD BufferSize = 2048;
    LPVOID Buffer = new char[2048];
    // 调用WSAStartup后调用WNetEnumResource做进一步的枚举工作
    WNetEnumResource( hEnum, &Count, Buffer, &BufferSize );
    NetResource = (NETRESOURCE*)Buffer; char szHostName[200]; for ( unsigned int i = 0; i < BufferSize/sizeof(NETRESOURCE); i++, NetResource++ ) 
    {
    if ( NetResource->dwUsage == RESOURCEUSAGE_CONTAINER && NetResource->dwType == RESOURCETYPE_ANY ) {
    if ( NetResource->lpRemoteName )
    {
    CString strFullName = NetResource->lpRemoteName;
    if ( 0 == strFullName.Left(2).Compare("\\\\") ) strFullName = strFullName.Right(strFullName.GetLength()-2);
                        
    //获得主机名
    gethostname( szHostName, strlen( szHostName ) );
    //由主机名获得跟它对应的主机信息
    host = gethostbyname(strFullName);
    if(host == NULL) continue; 
    ptr = (struct in_addr *) host->h_addr_list[0]; 
    // 提取IP地址信息,地址形式如下: 211.40.35.76  
    int a = ptr->S_un.S_un_b.s_b1;  // 211 
    int b = ptr->S_un.S_un_b.s_b2;  // 40
    int c = ptr->S_un.S_un_b.s_b3;  // 35
    int d = ptr->S_un.S_un_b.s_b4;  // 76 strTemp.Format("%s -->  %d.%d.%d.%d",strFullName,a,b,c,d);
    // 加入到链表中 m_list.AddString(strTemp);
    }
    }
    }
    delete Buffer;
    // 结束枚举工作
    WNetCloseEnum( hEnum ); 
    } // 卸载Winsock.dll
    WSACleanup();// 列出本机IP地址和名字
    CString m_strIPAddress;
    // WSADATA wsaData;
    int iRet = WSAStartup(MAKEWORD(0x02, 0x02), &wsaData);
    if (iRet != 0)
    {
    TRACE("初始化winsock动态库出错!");
    m_strIPAddress = "";
    return;
     }   struct in_addr localaddr;
      struct hostent *hp=NULL;
      char hostname[50];
      gethostname(hostname,49);//主机名   hp=gethostbyname(hostname);//主机信息
      memcpy(&localaddr,hp->h_addr,hp->h_length);//地址   m_strIPAddress = inet_ntoa(localaddr);//变成char *
      WSACleanup();
      

  3.   

    不过好象不行,h_addr_list里的只是一个IP的
      

  4.   

    用gethostname 和gethostbynasme, 前者是获得主机名,后者是根据主机名获得主机IP地址。
    给你个大至的例子:void CNetWorkDlg::GetIP()
    {
         char szhostname[128];
         CString str;
         
         if (gethostname(szhostname, 128) == 0)
         {
              struct hostent* phost;
              int i;
              phost = ge4thostbyname(szhostname);
              m_hostname = szhostname;
              i = 0;
              int j;
              int h_length = 4;
              for (j=0; j<h_length; j++)
              {
                  CString addr;
                  if (j>0)
                       str += ".";
                   addr.Fromat("%u", (unsigned int )(unsigned char*)phost->h_addr_list[i][j]);
                       str += addr
               } 
         }
        m_ipaddress = str;
        UpdateData(FALSE);
    }
      

  5.   

    TO:hxzb7215191
    多网卡或者是单网卡但多IP的怎么得到所有的IP,只得到一个IP是不够的,谢谢