我想写一程序检测网络中的计算机,并得到各个计算机的ip,该怎么实现,望各位大虾给指点高招,谢谢!!!

解决方案 »

  1.   

    需要在给定的一个网段内,利用Ping\SNMP等检查机器设备的连通性
      

  2.   


    BOOL CListenDlg::Enumerate(LPNETRESOURCE lpNetRC_p, int depth)
    {
    HANDLE hEnum = 0;
    DWORD dwScope = RESOURCE_GLOBALNET;
    DWORD dwType = RESOURCETYPE_ANY;

    DWORD dwResult = WNetOpenEnum(dwScope,dwType,0,lpNetRC_p,&hEnum);

    if(dwResult != NO_ERROR)
    return false;

    DWORD dwBuffer = 16384;
    DWORD dwEntries = -1;
    LPNETRESOURCE lpnrLocal = 0;
    BOOL bRet = TRUE;

    do
    {
    lpnrLocal = (LPNETRESOURCE)GlobalAlloc(GPTR,dwBuffer);
    dwResult = WNetEnumResource(hEnum,&dwEntries,lpnrLocal,&dwBuffer);

    if(dwResult == NO_ERROR)
    {
    for(DWORD i =0; i < dwEntries ; i++)
    {
    CString nsname;
    nsname = lpnrLocal[i].lpRemoteName;
    CString remotename = nsname; if( strcmp(remotename.Left(2),"\\") )
    remotename = remotename.Right(remotename.GetLength()-2); for(int j=0;j<namevector.size();j++)
    {
    if(namevector.at(j) == remotename)
    break;
    }
    hostent FAR* lpHostEnt = gethostbyname(remotename);

    CString remoteip;
    if(lpHostEnt != NULL)
    {
    LPSTR lpAddr = lpHostEnt->h_addr_list[0];
    in_addr inAddr;
    memmove(&inAddr,lpAddr,4);
    remoteip = inet_ntoa(inAddr);
    }
    nsname += "    ";
    nsname += remoteip; if(depth ==1)
    {
    // ((CListCtrl*)GetDlgItem(IDC_LIST1))->InsertItem(0,nsname);
    }
    else if(depth == 2)
    {
    namevector.push_back(nsname);
    ipvector.push_back(remoteip);
    ((CListCtrl*)GetDlgItem(IDC_LIST1))->InsertItem(0,nsname);
    ((CListCtrl*)GetDlgItem(IDC_LIST1))->SetItemText(0,1,"0");
    ((CListCtrl*)GetDlgItem(IDC_LIST1))->SetItemText(0,2,"0");
    }

    if(RESOURCEUSAGE_CONTAINER == (lpnrLocal[i].dwUsage & RESOURCEUSAGE_CONTAINER))
    if(depth<=1 && !Enumerate(&lpnrLocal[i],depth+1))
    {
    }
    }
    }
    else
    {
    if(dwResult != ERROR_NO_MORE_ITEMS)
    return FALSE;
    }
    }
    while(dwResult != ERROR_NO_MORE_ITEMS);

    if(lpnrLocal)
    GlobalFree((HGLOBAL)lpnrLocal);

    WNetCloseEnum(hEnum);
    return bRet;
    }
    namevector是一个CString的数组,保存了网络上每台机器的用户名加ip地址  你自己分析一下吧
    调用的时候直接Enumerate(0,0)就可以了
      

  3.   

    NND,微软吧啥都写好了,俺们作什么啊改搞GNU了
    G++ + GCC is perfect
      

  4.   

    to ssbelle(沉默的骆驼) :
        namevector是什么变量?
      

  5.   

    手里有一个别人做的程序,实现的还好,而且有ip,mac,workgroup..还有当然是源码了:)
    如果楼主要的话,留下邮箱!
      

  6.   

    vector<CString>  namevector        保存网络中计算机名用的一个vector
    vector<CString>  ipvector          保存计算机名相应的ip
      

  7.   

    to lifengice0706(无): 
        
         谢谢了!
    Email:[email protected] To nkwesley(江南丝竹):
       
    可以发一下吗!!!!谢谢
      

  8.   

    to ssbelle(沉默的骆驼):
    应该怎么定义:
    是不是:CString  namevector;但是有错也。
    vector<CString>  namevector是什么意思?
      

  9.   

    TO lifengice0706(无) :不好意思,没有收到,麻烦在发一次,谢谢!!!!
      

  10.   

    vector<CString>  namevector 
    vector是标准模板库中的  这样定义的namevector是一个大小可变的数组
    需要加头文件
    #include <vector>
    using namespace std;
      

  11.   


    #include <iostream>
    #include <vector>
    using namespace std; vector<CString>  namevector;   //加在类成员变量里BOOL CYourClass::Enumerate(LPNETRESOURCE lpNetRC_p, int depth)
    {
    HANDLE hEnum = 0;
    DWORD dwScope = RESOURCE_GLOBALNET;
    DWORD dwType = RESOURCETYPE_ANY;

    DWORD dwResult = WNetOpenEnum(dwScope,dwType,0,lpNetRC_p,&hEnum);

    if(dwResult != NO_ERROR)
    return false;

    DWORD dwBuffer = 16384;
    DWORD dwEntries = -1;
    LPNETRESOURCE lpnrLocal = 0;
    BOOL bRet = TRUE;

    do
    {
    lpnrLocal = (LPNETRESOURCE)GlobalAlloc(GPTR,dwBuffer);
    dwResult = WNetEnumResource(hEnum,&dwEntries,lpnrLocal,&dwBuffer);

    if(dwResult == NO_ERROR)
    {
    for(DWORD i =0; i < dwEntries ; i++)
    {
    CString nsname;
    nsname = lpnrLocal[i].lpRemoteName;
    CString remotename = nsname; if( strcmp(remotename.Left(2),"\\") )
    remotename = remotename.Right(remotename.GetLength()-2); for(int j=0;j<namevector.size();j++)
    {
    if(namevector.at(j) == remotename)
    break;
    }
    hostent FAR* lpHostEnt = gethostbyname(remotename);

    CString remoteip;
    if(lpHostEnt != NULL)
    {
    LPSTR lpAddr = lpHostEnt->h_addr_list[0];
    in_addr inAddr;
    memmove(&inAddr,lpAddr,4);
    remoteip = inet_ntoa(inAddr);
    }
    nsname += "    ";
    nsname += remoteip; if(depth ==1)
    {
    }
    else if(depth == 2)
    {
    namevector.push_back(nsname);
    //ipvector.push_back(remoteip);
    }

    if(RESOURCEUSAGE_CONTAINER == (lpnrLocal[i].dwUsage & RESOURCEUSAGE_CONTAINER))
    if(depth<=1 && !Enumerate(&lpnrLocal[i],depth+1))
    {
    }
    }
    }
    else
    {
    if(dwResult != ERROR_NO_MORE_ITEMS)
    return FALSE;
    }
    }
    while(dwResult != ERROR_NO_MORE_ITEMS);

    if(lpnrLocal)
    GlobalFree((HGLOBAL)lpnrLocal);

    WNetCloseEnum(hEnum);
    return bRet;
    }调用如下:void YouEvent()
    {
    Enumerate(0,0);
    for(int i = 0; i< namevector.size(); ++i)
    {
    cout<<namevector.at(i)<<endl;
    }
    }
      

  12.   

    WNetOpenEnum
    The WNetOpenEnum function starts an enumeration of network resources or existing connections. DWORD WNetOpenEnum(
      DWORD dwScope,     // scope of enumeration
      DWORD dwType,      // resource types to list
      DWORD dwUsage,     // resource usage to list
      LPNETRESOURCE lpNetResource,
                         // pointer to resource structure
      LPHANDLE lphEnum   // pointer to enumeration handle buffer
    );
     
    Parameters
    dwScope 
    Specifies the scope of the enumeration. This parameter can be one of the following values: Value Meaning 
    RESOURCE_CONNECTED All currently connected resources (the dwUsage parameter is ignored). 
    RESOURCE_CONTEXT Only resources in the network context of the caller (used for a Network Neighborhood view). The dwUsage parameter is ignored. 
    RESOURCE_GLOBALNET All resources on the network. 
    RESOURCE_REMEMBERED All remembered (persistent) connections (the dwUsage parameter is ignored). 
    dwType 
    Specifies the resource types to enumerate. This parameter can be a combination of the following values: Value Meaning 
    RESOURCETYPE_ANY All resources (this value cannot be combined with RESOURCETYPE_DISK or RESOURCETYPE_PRINT). 
    RESOURCETYPE_DISK All disk resources. 
    RESOURCETYPE_PRINT All print resources. 
    If a network provider cannot distinguish between print and disk resources, it may enumerate all resources. dwUsage 
    Specifies the resource usage to be enumerated. This parameter can be a combination of the following values: Value Meaning 
    0 All resources 
    RESOURCEUSAGE_CONNECTABLE All connectable resources 
    RESOURCEUSAGE_CONTAINER All container resources 
    This parameter is ignored if the dwScope parameter is not RESOURCE_GLOBALNET. lpNetResource 
    Points to a NETRESOURCE structure specifying the container to enumerate. 
    If this parameter is NULL, the root of the network is assumed. Windows organizes a network as a hierarchy; the root is the topmost container in the network. If this parameter is not NULL, it must point to a NETRESOURCE structure. This structure can be filled in by the application or be returned by a call to the WNetEnumResource function. The NETRESOURCE structure must specify a container resource; that is, the RESOURCEUSAGE_CONTAINER value must be specified in the dwUsage member. To enumerate all network resources, an application can begin the enumeration by calling WNetOpenEnum with lpNetResource set to NULL and then use the returned handle with WNetEnumResource to enumerate resources. If one of the resources in the NETRESOURCE array returned by the WNetEnumResource function is a container resource, WNetOpenEnum can be used to open the resource for further enumeration. If the dwScope parameter is not RESOURCE_GLOBALNET, this parameter must be NULL. lphEnum 
    Points to a variable filled with an enumeration handle that can be used in a subsequent call to WNetEnumResource. 
    Return Values
    If the function succeeds, the return value is NO_ERROR. If the function fails, the return value is an error code. To get extended error information, callGetLastError. GetLastError may return one of the following error codes: Value Meaning 
    ERROR_NOT_CONTAINER The lpNetResource parameter does not point to a container. 
    ERROR_INVALID_PARAMETER Either the dwScope or dwType parameter is invalid, or there is a bad combination of parameters. 
    ERROR_NO_NETWORK No network is present. 
    ERROR_EXTENDED_ERROR A network-specific error occurred. To get a description of the error, use the WNetGetLastError function. 
    The function returns error codes for compatibility with Windows version 3.1. For compatibility with Windows NT, the function also sets the error code value returned byGetLastError. Res
    The exact interpretation of RESOURCE_CONTEXT in the dwScope parameter depends on the networks installed on the machine.The WNetOpenEnum function is used to begin enumeration of the resources in a single container. The following examples show the hierarchical structure of a Microsoft LAN Manager network and a Novell Netware network: LanMan (container, in this case the provider) 
      ACCOUNTING (container, in this case the domain) 
        \\ACCTSPAY (container, in this case the server) 
          PAYFILES (disk) 
          LASERJET (print) 
     
    Netware (container, in this case the provider) 
      MARKETING (container, in this case the server) 
        SYS (disk, first one on any Netware server) 
        ANOTHERVOLUME (disk) 
        LASERJET (print) 
     
    Windows CE: The WNetOpenEnum function is called by the network browser application to create lists of available resources on the network. Windows CE does not support the predefined value of RESOURCE_CONTEXT because a device cannot belong to a specific network context.QuickInfo
      Windows NT: Use version 3.1 or later.
      Windows: Use Windows 95 or later.
      Windows CE: Use version 2.0 or later.
      Header: Declared in winnetwk.h.
      Import Library: Use mpr.lib.See Also
    Windows Networking (WNet) Overview, Windows Networking Functions, NETRESOURCE, WNetCloseEnum, WNetEnumResource, WNetGetLastError  
      

  13.   

    if(depth<=1 && !Enumerate(&lpnrLocal[i],depth+1))
    {
    }
    中的Enumerate是什么?有错误!!
      

  14.   

    Enumerate是递归  问题不在这里  可能是上边的宏定义没有找到
    你需要包含这个头文件
    #include "WINNETWK.H"
      

  15.   

    你还没收到吗?我用gmail的邮箱发的!
      

  16.   

    怎么会事,我还是没有收到;我的
    EMAIL:[email protected]
    是不是写对了!!!
      

  17.   

    to ssbelle(沉默的骆驼):
       哥们,可以发给我点源码吗?我该的总是出错!!!搞不对,谢谢了!!!
      

  18.   

    to lifengice0706(无):     这次受到了,谢谢了,以后有什么多指教!!!