一定要用api函数才能实现么?请作过的朋友指点一下,越详细越好!
谢谢!

解决方案 »

  1.   

    我的想法:网内每一台机器装上你的软件,交换各自的LOCALADDRESS,形成并维护一个“路由表”
      

  2.   

    怎样获得局域网中所有的计算机名和ip地址,不用API是完全可以的,你去一个个抄下来就可以了。
      

  3.   

    SB 怎样获得局域网中所有的计算机名和ip地址,不用API是完全可以的,你去一个个抄下来就可以了。
    如果是这样的话 那也不可能有h这类人了
      

  4.   

    fuzq(强强) ,你自以为是高手么?假设你是高手你就可以这么牛B么?你觉得骂一个初学者很过瘾么?CSDN里怎么会有你这种垃圾!污染环境!
      

  5.   

    这是我几年前做的一个枚举局域网内所有机器名及得到其IP地址的一段主程序。当时是用于局域网内的动态IP的管理。在WIN98下运行正常。当然你的机器要是加入了域。如需要我这里有编译好的程序.
    // LanManage.cpp : implementation file
    //#include "stdafx.h"
    #include "NetSniff.h"
    #include "LanManage.h"
    #include "LanManAbout.h"
    //////
    #include <windows.h>
    #include <winbase.h>
    #include <winnetwk.h>
    #include <winsock2.h>#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif/////////////////////////////////////////////////////////////////////////////
    // CLanManage dialog
    CLanManage::CLanManage(CWnd* pParent /*=NULL*/)
    : CDialog(CLanManage::IDD, pParent)
    {
    //{{AFX_DATA_INIT(CLanManage)
    // NOTE: the ClassWizard will add member initialization here
    //}}AFX_DATA_INIT
    }
    void CLanManage::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CLanManage)
    DDX_Control(pDX, IDC_LANMANAGE_LIST, m_clcListCtrl);
    DDX_Control(pDX, IDC_LANMANAGE_NETWORK, m_ctcNetwork);
    //}}AFX_DATA_MAP
    }
    BEGIN_MESSAGE_MAP(CLanManage, CDialog)
    //{{AFX_MSG_MAP(CLanManage)
    ON_NOTIFY(NM_DBLCLK, IDC_LANMANAGE_NETWORK, OnDblclkLanmanageNetwork)
    ON_WM_SYSCOMMAND()
    ON_WM_CREATE()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CLanManage message handlersBOOL CLanManage::OnInitDialog() 
    {
    CDialog::OnInitDialog();

    // TODO: Add extra initialization here
    SetClassLong(this->m_hWnd,GCL_HICON,(LONG)AfxGetApp()->LoadIcon(IDI_MAINICON));
    //Add About Menu
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
    CString strAboutMenu;
    strAboutMenu.LoadString(IDS_LANMANAGE_ABOUT);
    if (!strAboutMenu.IsEmpty())
    {
    pSysMenu->AppendMenu(MF_SEPARATOR);
    pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    CBitmap * pMenuBM=new CBitmap;
    pMenuBM->LoadBitmap(IDB_WBFSOFT);
    pSysMenu->SetMenuItemBitmaps(8,MF_BYPOSITION,pMenuBM,NULL);
    }
    //insert splitbar
    CRect crect(0,0,0,0);
    m_vsplitbar .Create(WS_CHILD|WS_BORDER|WS_DLGFRAME|WS_VISIBLE,crect,this,998);
    m_vsplitbar .SetPanes(&m_ctcNetwork ,&m_clcListCtrl );
    //Set TreeView ImageList
    HINSTANCE hinst=AfxGetApp()->m_hInstance ;
    LPCTSTR lpIcon="Shell32.dll";
    m_ilImageList.Create (16,16,ILC_COLOR|ILC_MASK,0,0); m_ilImageList.Add (ExtractIcon(hinst,lpIcon,13)); //0 All Lan
    m_ilImageList.Add (ExtractIcon(hinst,lpIcon,15)); //1 User PC
    m_ilImageList.Add (ExtractIcon(hinst,lpIcon,16)); //2 Printer
    m_ilImageList.Add (ExtractIcon(hinst,lpIcon,17)); //3 Network Nei
    m_ilImageList.Add (ExtractIcon(hinst,lpIcon,18)); //4 Domain Icon
    m_ilImageList.Add (ExtractIcon(hinst,lpIcon,28)); //5 Share
    m_ilImageList.Add (ExtractIcon(hinst,lpIcon,3)); //6 Folder m_ctcNetwork.SetImageList (&m_ilImageList,TVSIL_NORMAL);
    m_clcListCtrl .SetImageList (&m_ilImageList,TVSIL_NORMAL); m_ctcNetwork .SetTextColor (RGB(0,0,255));
    ///Insert Item
    HTREEITEM htiCurr;
    HTREEITEM htiParent=m_ctcNetwork.InsertItem ("网络邻居",3,3);
    //Insert domain Information
    DWORD dwRetEnum;
    DWORD cEntries=0xffffffff;
    DWORD cbBuffer;
    LPNETRESOURCE lpnrLocal=new _NETRESOURCEA[1024];
    HANDLE hEnum; cbBuffer=1024*sizeof(_NETRESOURCEA); WNetOpenEnum (RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0,NULL,&hEnum);
    lpnrLocal=(LPNETRESOURCE)GlobalAlloc(GPTR,cbBuffer);
    dwRetEnum=WNetEnumResource (hEnum,&cEntries,lpnrLocal,&cbBuffer); if (lpnrLocal->dwUsage ==RESOURCEUSAGE_CONTAINER)
    {
    WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,RESOURCEUSAGE_CONTAINER,
    lpnrLocal,&hEnum);
    cEntries =0xffffffff;
    dwRetEnum=WNetEnumResource (hEnum,&cEntries,lpnrLocal,&cbBuffer);
    for (int i=0;i<(int)cEntries;i++)
    {
    htiCurr=m_ctcNetwork .InsertItem (lpnrLocal[i].lpRemoteName ,4,4,htiParent );
    m_ctcNetwork .SetItemData (htiCurr,0);
    }
    }
    ///Set Root Mark that its children have been generated
    m_ctcNetwork.SetItemData (htiParent,1); //Initial ListCtrl
    RECT rect;
    int nWidth;
    m_clcListCtrl .GetClientRect (&rect);
    nWidth=(rect.right - rect.left)/3 ; m_clcListCtrl .SetTextColor (RGB(0,0,255));
    m_clcListCtrl .InsertColumn (0,"计算机名",LVCFMT_LEFT,nWidth);
    m_clcListCtrl .InsertColumn (1,"描述",LVCFMT_LEFT,nWidth);
    m_clcListCtrl .InsertColumn (2,"IP地址",LVCFMT_LEFT,nWidth); return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
    }void CLanManage::OnDblclkLanmanageNetwork(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    // TODO: Add your control notification handler code here
    DWORD dwRet;
    DWORD cEntries=0xffffffff;
    DWORD cbBuffer;
    HANDLE hEnum;
    LPNETRESOURCE lpNet=new _NETRESOURCEA[1024];
    cbBuffer=1024*sizeof(_NETRESOURCEA);
    ////Treeview item
    TVITEM tvSelItem;
    int nIndex=0;
    POINT ptCurr;
    //Initial Winsock
    WORD dwVersion=MAKEWORD(2,2);
    WSADATA wsaDat;
    BOOL bMark=FALSE;
    int nRet=WSAStartup (dwVersion,&wsaDat);
    if (nRet==0) bMark=TRUE; HTREEITEM htiSel=m_ctcNetwork .GetSelectedItem ();
    DWORD dwMark=m_ctcNetwork .GetItemData(htiSel); tvSelItem.hItem=htiSel;
    tvSelItem.cchTextMax=32;
    tvSelItem.pszText=new char[32];
    tvSelItem.lParam=NULL;
    tvSelItem.mask=TVIF_HANDLE |TVIF_IMAGE |TVIF_SELECTEDIMAGE |TVIF_TEXT ;
    m_ctcNetwork .GetItem (&tvSelItem); if ((dwMark==1)&&(tvSelItem.iImage==4)&&bMark) 
    {
    ///Set ListView Item
    if (!bMark) 
    {
    WSACleanup();
    GlobalFree(lpNet);
    return;
    }
    ///
    lpNet->dwDisplayType =RESOURCEDISPLAYTYPE_SERVER;
    lpNet->dwScope =RESOURCE_GLOBALNET;
    lpNet->dwType =RESOURCETYPE_ANY;
    lpNet->dwUsage =RESOURCEUSAGE_CONTAINER;
    //lstrcpy(lpNet->lpRemoteName ,strText);
    lpNet->lpRemoteName =tvSelItem.pszText;

    lpNet=(LPNETRESOURCE)GlobalAlloc(GPTR,cbBuffer);
    WNetOpenEnum (RESOURCE_GLOBALNET,RESOURCETYPE_ANY,RESOURCEUSAGE_CONNECTABLE,
    lpNet,&hEnum);
    dwRet=WNetEnumResource (hEnum,&cEntries,lpNet,&cbBuffer);

    //Start to Enum all PC which belongs to the current group
    WNetOpenEnum (RESOURCE_CONTEXT,RESOURCETYPE_ANY,NULL,
    lpNet,&hEnum);
    cEntries=0xffffffff;
    lpNet->lpRemoteName =tvSelItem.pszText;
    WNetOpenEnum(lpNet->dwScope ,lpNet->dwType ,lpNet->dwUsage ,lpNet,&hEnum);
    dwRet=WNetEnumResource (hEnum,&cEntries,lpNet,&cbBuffer); ///Start To InsertItem into TreeView and ListView
    CString strPC1; m_clcListCtrl .DeleteAllItems (); for (int istart=0;istart<(int)cEntries;istart++)
    {
    strPC1.Format ("%s",lpNet[istart].lpRemoteName );
    strPC1=strPC1.Right (strPC1.GetLength () - 2);
    ///Set ListView Item
    m_clcListCtrl .InsertItem(istart,strPC1,1);
    m_clcListCtrl .SetItemText (istart,1,lpNet[istart].lpComment );
    ///Get the PC IP Address
    HOSTENT * host1=gethostbyname (strPC1);
      

  6.   

    if (host1!=NULL)
    {
    in_addr addr1;
    CopyMemory(&addr1.S_un .S_addr ,host1->h_addr_list [0],host1->h_length );
    LPTSTR lpIPAddr1=inet_ntoa(addr1);

    m_clcListCtrl .SetItemText (istart,2,lpIPAddr1 );
    }
    else
    {
    m_clcListCtrl .SetItemText (istart,2,"Unresolved!");
    } m_clcListCtrl .GetItemPosition (istart,&ptCurr);
    m_clcListCtrl .Update(istart);
    m_clcListCtrl .Scroll(CSize(ptCurr));
    }
    WSACleanup();
    GlobalFree(lpNet);
    return;
    } if (dwMark==1) 
    {
    WSACleanup();
    return;
    }
    ///Set Current TreeNode Children Information
    //If it is domain selected
    if (tvSelItem.iImage==4)
    {
    lpNet->dwDisplayType =RESOURCEDISPLAYTYPE_SERVER;
    lpNet->dwScope =RESOURCE_GLOBALNET;
    lpNet->dwType =RESOURCETYPE_ANY;
    lpNet->dwUsage =RESOURCEUSAGE_CONTAINER;
    //lstrcpy(lpNet->lpRemoteName ,strText);
    lpNet->lpRemoteName =tvSelItem.pszText;

    lpNet=(LPNETRESOURCE)GlobalAlloc(GPTR,cbBuffer);
    WNetOpenEnum (RESOURCE_GLOBALNET,RESOURCETYPE_ANY,RESOURCEUSAGE_CONNECTABLE,
    lpNet,&hEnum);
    dwRet=WNetEnumResource (hEnum,&cEntries,lpNet,&cbBuffer);

    //Start to Enum all PC which belongs to the current group
    WNetOpenEnum (RESOURCE_CONTEXT,RESOURCETYPE_ANY,NULL,
    lpNet,&hEnum);
    cEntries=0xffffffff;
    lpNet->lpRemoteName =tvSelItem.pszText;
    WNetOpenEnum(lpNet->dwScope ,lpNet->dwType ,lpNet->dwUsage ,lpNet,&hEnum);
    dwRet=WNetEnumResource (hEnum,&cEntries,lpNet,&cbBuffer); ///Start To InsertItem into TreeView and ListView
    CString strPC; m_clcListCtrl .DeleteAllItems (); for (int i=0;i<(int)cEntries;i++)
    {
    strPC.Format ("%s",lpNet[i].lpRemoteName );
    strPC=strPC.Right (strPC.GetLength () - 2);
    HTREEITEM htiCurr=m_ctcNetwork .InsertItem(strPC ,1,1,htiSel);
    ///Set ListView Item
    if (!bMark) continue;
    m_clcListCtrl .InsertItem(i,strPC,1);
    m_clcListCtrl .SetItemText (i,1,lpNet[i].lpComment );
    ///Get the PC IP Address
    HOSTENT * host=gethostbyname (strPC);
    if (host!=NULL)
    {
    in_addr addr;
    CopyMemory(&addr.S_un .S_addr ,host->h_addr_list [0],host->h_length );
    LPTSTR lpIPAddr=inet_ntoa(addr);
    m_clcListCtrl .SetItemText (i,2,lpIPAddr );
    }
    else
    {
    m_clcListCtrl .SetItemText (i,2,"Unresolved!");
    }
    //
    m_clcListCtrl .GetItemPosition (i,&ptCurr);
    m_clcListCtrl .Update(i);
    m_clcListCtrl .Scroll(CSize(ptCurr));
    }
    m_ctcNetwork .SetItemData (htiSel,1);
    }
    else if (tvSelItem.iImage==1)
    {
    lpNet=(LPNETRESOURCE)GlobalAlloc(GPTR,cbBuffer);
    lpNet->dwDisplayType =RESOURCEDISPLAYTYPE_SHARE;
    lpNet->dwScope =RESOURCE_GLOBALNET;
    lpNet->dwType =RESOURCETYPE_ANY;
    lpNet->dwUsage =RESOURCEUSAGE_CONTAINER;
    lpNet->lpRemoteName =new char[32];
    //lstrcpy(lpNet->lpRemoteName ,strText);
    wsprintf (lpNet->lpRemoteName ,"%s%s","\\\\",tvSelItem.pszText);

    //lpNet=(LPNETRESOURCE)GlobalAlloc(GPTR,cbBuffer);
    dwRet=WNetOpenEnum (RESOURCE_GLOBALNET,RESOURCETYPE_ANY,RESOURCEUSAGE_CONTAINER,
    lpNet,&hEnum);
    if (dwRet!=NO_ERROR) 
    {
    WSACleanup();
    GlobalFree(lpNet);
    return;
    }
    dwRet=WNetEnumResource (hEnum,&cEntries,lpNet,&cbBuffer);
    /*
    if (dwRet!=NO_ERROR) 
    {
    WSACleanup();
    GlobalFree(lpNet);
    return;
    }
    WNetCloseEnum(hEnum);
    ////
    //Start to Enum all PC which belongs to the current group
    HTREEITEM htiParent=m_ctcNetwork .GetParentItem(htiSel);
    TVITEMA tvi;
    tvi.hItem =htiParent;
    tvi.mask =TVIF_CHILDREN |TVIF_HANDLE |TVIF_IMAGE |TVIF_SELECTEDIMAGE |TVIF_TEXT ;
    m_ctcNetwork .GetItem (&tvi); lpNet->lpRemoteName =tvi.pszText ;
    dwRet=WNetOpenEnum(lpNet->dwScope ,lpNet->dwType ,lpNet->dwUsage ,lpNet,&hEnum);
    if (dwRet!=NO_ERROR) 
    {
    WSACleanup();
    GlobalFree(lpNet);
    return;
    }
    cEntries=0xffffffff;
    dwRet=WNetEnumResource (hEnum,&cEntries,lpNet,&cbBuffer);
    if (dwRet!=NO_ERROR) 
    {
    WSACleanup();
    GlobalFree(lpNet);
    return;
    }
    WNetCloseEnum(hEnum);
    wsprintf (lpNet->lpRemoteName ,"%s%s","\\\\",tvSelItem.pszText); dwRet=WNetOpenEnum(lpNet->dwScope ,lpNet->dwType ,lpNet->dwUsage ,lpNet,&hEnum);
    if (dwRet!=NO_ERROR) 
    {
    WSACleanup();
    GlobalFree(lpNet);
    return;
    }
    cEntries=0xffffffff;
    dwRet=WNetEnumResource (hEnum,&cEntries,lpNet,&cbBuffer);
    if (dwRet!=NO_ERROR) 
    {
    WSACleanup();
    GlobalFree(lpNet);
    return;
    }
    WNetCloseEnum(hEnum);*/
    for (int j=0;j<(int)cEntries;j++)
    {
    if (lpNet[j].dwType ==RESOURCETYPE_DISK)
    {
    m_ctcNetwork .InsertItem(lpNet[j].lpRemoteName ,6,6,htiSel );
    }
    else if (lpNet[j].dwType ==RESOURCETYPE_PRINT)
    {
    m_ctcNetwork .InsertItem(lpNet[j].lpRemoteName ,2,2,htiSel );
    }
    else
    {
    m_ctcNetwork .InsertItem(lpNet[j].lpRemoteName ,5,5,htiSel );
    }
    }
    m_ctcNetwork .SetItemData (htiSel,1);
    }
    WSACleanup();
    GlobalFree(lpNet);
    *pResult = 0;
    }////System Command
    void CLanManage::OnSysCommand (UINT nID,LPARAM lParam)
    {
    if ((nID&0xFFF0)==IDM_ABOUTBOX)
    {
    CLanManAbout paboutdlg; //=new CLanManAbout();
    // if (paboutdlg ->GetSafeHwnd ()==0)
    if (paboutdlg.DoModal()==IDOK)
    {
    // SetClassLong(paboutdlg->m_hWnd,GCL_HICON,IDI_MAINICON);
    // paboutdlg->Create (IDD_LANMAN_ABOUT);
    // paboutdlg->ShowWindow (SW_SHOW);
    EndDialog(0);
    return;
    }
    }
    else
    {
    CDialog::OnSysCommand (nID,lParam);
    }
    }int CLanManage::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
    if (CDialog::OnCreate(lpCreateStruct) == -1)
    return -1;
    /* No FrameWnd can not dock toolbar
    if (!m_tbToolbar.CreateEx (this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_ALIGN_TOP|
    CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||
    !m_tbToolbar.LoadToolBar (IDR_MAINFRAME)
    {
    return -1
    }
    m_tbToolbar.EnableDocking (CBRS_ALIGN_ANY);
         */
    return 0;
    }
      

  7.   

    哥哥,VC++的啊!
    不过还是很感谢你!
    等我的c++学好了以后再研究这段代码,现在先收藏!