在一个局域网中我怎样才能得到别人的网卡地址呢,还有 NETRESOURCE 结构体是一个什么样的东西,相应的函数又怎样用WNetOpenEnum() WNetEnumResource(),
这些东西我在MSDN里都找不到,请各位帮忙。

解决方案 »

  1.   

    在最新的Platform SDK 里面就有:
    DWORD WNetOpenEnum(
      DWORD dwScope,
      DWORD dwType,
      DWORD dwUsage,
      LPNETRESOURCE lpNetResource,
      LPHANDLE lphEnum
    );
    可以上微软网站下载
      

  2.   

    GetMacAddress
    Include nb30.h and link with netapi32.lib. This article is based on Q118623. 
    Source
    typedef struct _ASTAT_
    {
    ADAPTER_STATUS adapt;
    NAME_BUFFER    NameBuff[30];
    } ASTAT, * PASTAT;
    CString GetMacAddress(CString sNetBiosName)
    {
        ASTAT Adapter;

        NCB ncb;
        UCHAR uRetCode;

        memset(&ncb, 0, sizeof(ncb));
        ncb.ncb_command = NCBRESET;
        ncb.ncb_lana_num = 0;

        uRetCode = Netbios(&ncb);

        memset(&ncb, 0, sizeof(ncb));
        ncb.ncb_command = NCBASTAT;
        ncb.ncb_lana_num = 0;

        sNetBiosName.MakeUpper();

        FillMemory(ncb.ncb_callname, NCBNAMSZ - 1, 0x20);

        strcpy((char *)ncb.ncb_callname, (LPCTSTR) sNetBiosName);

        ncb.ncb_callname[sNetBiosName.GetLength()] = 0x20;
        ncb.ncb_callname[NCBNAMSZ] = 0x0;

        ncb.ncb_buffer = (unsigned char *) &Adapter;
        ncb.ncb_length = sizeof(Adapter);

        uRetCode = Netbios(&ncb);
        
        CString sMacAddress;

        if (uRetCode == 0)
        {
         sMacAddress.Format(_T("%02x%02x%02x%02x%02x%02x"),
             Adapter.adapt.adapter_address[0],
                Adapter.adapt.adapter_address[1],
                Adapter.adapt.adapter_address[2],
                Adapter.adapt.adapter_address[3],
                Adapter.adapt.adapter_address[4],
                Adapter.adapt.adapter_address[5]);
        }
        return sMacAddress;
    }
      

  3.   

    列举局域网上的电脑:BOOL CNetEnumDlg::NetEnum(LPNETRESOURCE lpNetRC, DWORD dwFlags_p)
    {
    DWORD dwRet = 0;
    HANDLE hEnum;
    DWORD dwBuffer = 16384 ; // 16K is reasonable size
    DWORD dwEntries = 0xFFFFFFFF ; // enumerate all possible entries
    LPNETRESOURCE lpnrLocal = 0; DWORD dwScope = RESOURCE_GLOBALNET ;
    if( dwFlags_p & 2 )
    dwScope = RESOURCE_CONNECTED ;
    else if( dwFlags_p & 4 )
    dwScope = RESOURCE_REMEMBERED ;
    // else GLOBALNET ... DWORD dwType = RESOURCETYPE_ANY ;
    if( dwFlags_p & 16 )
    dwType = RESOURCETYPE_DISK ;
    else if( dwFlags_p & 32 )
    dwType = RESOURCETYPE_PRINT ;
    // else TYPE_ANY ... dwRet = WNetOpenEnum(dwScope, dwType, 0, lpNetRC, &hEnum);
    if(dwRet != NO_ERROR)
    return FALSE; do {
    // first allocate buffer for NETRESOURCE structures ...
    lpnrLocal = (LPNETRESOURCE) GlobalAlloc( GPTR, dwBuffer ) ; dwRet = WNetEnumResource(
    hEnum, // resource-handle
    &dwEntries,
    lpnrLocal,
    &dwBuffer
    ) ; if( dwRet == NO_ERROR ) 
    {
    for( register DWORD i = 0 ; i < dwEntries ; i++ ) 
    {
    if(lpnrLocal[i].dwDisplayType == RESOURCEDISPLAYTYPE_SERVER)
    {
    CString kk = lpnrLocal[i].lpRemoteName;
    m_CtrlList.AddString(kk);
    }

    if( RESOURCEUSAGE_CONTAINER == (lpnrLocal[i].dwUsage & RESOURCEUSAGE_CONTAINER) 
         && lpnrLocal[i].dwDisplayType != RESOURCEDISPLAYTYPE_SERVER )
    NetEnum(&lpnrLocal[i], dwFlags_p);
    }
    }
    } while( dwRet != ERROR_NO_MORE_ITEMS ); if( lpnrLocal )
    GlobalFree((HGLOBAL) lpnrLocal);

    WNetCloseEnum(hEnum) ;
    return TRUE;}
      

  4.   

    干么要那么复杂呢?向局域网发送一个ARP请求不就可以了?
    用函数SendARP(...)
      

  5.   

    以下是MSDN的例子://Example Code
    //The following code demonstrates how to obtain the media access 
    //control (MAC) address associated with a specified IP address.
    //
    // Link with ws2_32.lib and iphlpapi.lib
    //#include <windows.h>
    #include <stdio.h>
    #include <tchar.h>
    #include <iphlpapi.h>
    int __cdecl main()
    {
        HRESULT hr;
        IPAddr  ipAddr;
        ULONG   pulMac[2];
        ULONG   ulLen;    ipAddr = inet_addr ("216.145.25.31");
        memset (pulMac, 0xff, sizeof (pulMac));
        ulLen = 6;
        
        hr = SendARP (ipAddr, 0, pulMac, &ulLen);
        printf ("Return %08x, length %8d\n", hr, ulLen);
        
        size_t i, j;
        char * szMac = new char[ulLen*3];
        PBYTE pbHexMac = (PBYTE) pulMac;    //
        // Convert the binary MAC address into human-readable
        //
        for (i = 0, j = 0; i < ulLen - 1; ++i) {
            j += sprintf (szMac + j, "%02X:", pbHexMac[i]);
        }
        
        sprintf (szMac + j, "%02X", pbHexMac[i]);
        printf ("MAC address %s\n", szMac);
        
        delete [] szMac;    return 0;
    }//
    //Requirements 
    //  Windows NT/2000/XP: Included in Windows 2000 and later.
    //  Windows 95/98/Me: Unsupported.
    //  Header: Declared in Iphlpapi.h.
    //  Library: Use Iphlpapi.lib.
      

  6.   

    #include "..."#pragma comment ( lib, "ws2_32.lib" )void main( int argc, char ** argv )
    {
        int numberOfHost = 1;
        struct hostent *remoteHostent;    //处理命令行参数
        if ( argc == 3 )
        numberOfHost = atoi( argv[2] );
        if ( ( argc >3 ) || ( argc < 2 ) )
        {
            printf( "RmtHost v0.2 - Get remote HostName /MacAddress\n" );
            printf( "by ShotgunLabs ( [email protected] )\n\n" );
            printf( "Usage :\n\tRmtHost.exe [RemoteIP] \n\n" );
            printf( "Example:\n\tRmtHost.exe 192.168.0.3\n" );
            printf( "\tRmtHost.exe 192.168.0.3 255\n\n" );
            exit( 0 );
        }     //初始化SOCKET
        WSADATA wsaData;
        int iRet = WSAStartup(MAKEWORD(2,1), &wsaData);
        if ( iRet != 0 )
        {
            printf( "WSAStartup Error:%d\n", GetLastError() );
            exit( 0 );
        }
        int nRemoteAddr = inet_addr( argv[1] );
        remoteHostent= (struct hostent*)malloc( sizeof(struct hostent ));
        struct in_addr sa;
        for ( int i = 0; i < numberOfHost; i ++ )
        {
            //获取远程机器名
            sa.s_addr = nRemoteAddr;
            printf( "\nIpAddress : %s\n", inet_ntoa( sa ) );
            remoteHostent = gethostbyaddr( (char*)&nRemoteAddr,4, AF_INET );
            if ( remoteHostent )
                printf( "HostName : %s\n",remoteHostent->h_name );
            else
                printf( "gethostbyaddr Error:%d\n",GetLastError() );
            //发送ARP查询包获得远程MAC地址        unsigned char macAddress[6];
            ULONG macAddLen = 6;
            iRet=SendARP(nRemoteAddr, (unsigned long)NULL,(PULONG)&macAddress, &macAddLen);
            if ( iRet == NO_ERROR )
            {
                printf( "MacAddress: " );
                for( int i =0; i<6; i++ )
                {
                    printf( "%.2x", macAddress[i] );
                    if ( i<5 ) printf( "-" );
                }
                printf( "\n" );
            }
            else
                printf( "SendARP Error:%d\n", GetLastError());
                nRemoteAddr = htonl( ntohl( nRemoteAddr ) + 1 );
        }
    }
      

  7.   

    //use IpHlpapi
    // Note: Win2000 only
    //   NOT NT 4.0, Win9x, WinME#pragma comment( lib, "Iphlpapi" )
    #pragma comment( lib, "Ws2_32" )#include <windows.h>
    #include <Iphlpapi.h>int main( ) {IPAddr ip = 0;
    ULONG  mac = 0;
    DWORD  error = 0;    DWORD dwSize = sizeof( ULONG) ;
        ip = inet_addr("192.168.0.100");
        //ip = inet_addr("xxx.xxx.xxx.xxx");
        error = SendARP(ip,0,&mac,&dwSize);    return 0;
    }