能过网络命令nbtstat得到的速度快.但是不全(是不是关了137端口的原因.)有没有方法象"网络执法官"那样快速,全面地列举局域内所有ip??谢谢.

解决方案 »

  1.   

    SendARP可以查询ip域MAC地址的对应,但是不支持windows 9x,使用Wincap库也是一种选择,推荐
      

  2.   

    http://www.vckbase.net/code/viewcode.asp?id=1572
      

  3.   

    谢谢各位.orbit(走了走了)
    sendarp查询速度太慢.不能得到计算机名..Winpcap我就是用它.但没有找到好的方法得到网络所有计算机.goodboyws(深夜不眠者)
    那个源码就是用nbtstat.网内有些计算机无法取得.可能是关了137吧.
      

  4.   

    枚举局域网所有机器IP和机器名#include <windows.h>
    #include <Winnetwk.h>
    #include <stdio.h>
    #pragma comment(lib, "Ws2_32.lib")
    #pragma comment(lib, "Mpr.lib")BOOL GetIpAddress(char *hostname)
      {
          HOSTENT *lpHost=NULL;
               struct sockaddr_in   dest;      lpHost = gethostbyname(hostname);
          if (lpHost == NULL)
          {
             printf("gethostbyname failed: %d", WSAGetLastError());
          }
          else
          {
             for(int i=0; lpHost->h_addr_list[i] != NULL ;i++)
             {
                memcpy(&(dest.sin_addr), lpHost->h_addr_list[i],
                       lpHost->h_length);
                printf("IP address is: %s",
                         inet_ntoa(dest.sin_addr));
             }      }
      return TRUE;
    }
    BOOL WINAPI EnumerateFunc (LPNETRESOURCE lpnr)
    {
    HANDLE hEnum;
    DWORD dwIndex, dwResult, dwBufferSize = 16384, dwNumEntries = 0xFFFFFFFF;  // Enumerate all possible entries.
    LPNETRESOURCE lpnrLocal;          // Pointer to enumerated structures. dwResult = WNetOpenEnum (
    RESOURCE_GLOBALNET, // All resources on the network
    RESOURCETYPE_ANY,   // All resources 
    0,                  // Enumerate all resources.
    lpnr,               // The container to enumerate
    &hEnum);            // Handle to resource
    if (dwResult != ERROR_SUCCESS) 
    return FALSE; // Allocate memory for NETRESOURCE structures.
    if (!(lpnrLocal = (LPNETRESOURCE) LocalAlloc (LPTR, dwBufferSize)))
    printf("Not enough memory"); do 
    {
    dwResult = WNetEnumResource (
    hEnum,              // Resource handle
    &dwNumEntries,      // Number of entries
    lpnrLocal,          // LPNETRESOURCE
    &dwBufferSize);     // Buffer size if (dwResult == ERROR_SUCCESS) 
    {
    for (dwIndex = 0; dwIndex < dwNumEntries; dwIndex++)
    {
    printf("\nRemote Name:%s Comment: %s", lpnrLocal[dwIndex].lpRemoteName,
    lpnrLocal[dwIndex].lpComment);
    GetIpAddress(lpnrLocal[dwIndex].lpRemoteName+2);

    }
    }
    else if (dwResult != ERROR_NO_MORE_ITEMS) 
    break;

    while(dwResult != ERROR_NO_MORE_ITEMS);
    LocalFree (lpnrLocal);
    WNetCloseEnum (hEnum);
    return TRUE;
    } int main(int argc, char* argv[])
    {
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    wVersionRequested = MAKEWORD( 2, 2 );
    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err == 0 ) 
    {
    NETRESOURCE nr;
    nr.dwScope = RESOURCE_GLOBALNET;
    nr.dwType = RESOURCETYPE_DISK;  
    nr.dwUsage = RESOURCEUSAGE_CONTAINER;
    nr.lpLocalName = TEXT("");
    nr.lpRemoteName = TEXT("MyDomain");//这里改为你的域名
    nr.lpComment = TEXT("");
    nr.lpProvider = TEXT("");
    EnumerateFunc (&nr); 
    }
    return 0;
    }
      

  5.   

    首先说明,nbtstat的方法是存在137端口问题的,至于http://www.vckbase.net/code/viewcode.asp?id=1572
    中的代码,存在一定问题。特别是在处理回应消息的那一段,有些特殊的回应,比如有些中文会被忽略。致使有的机子没有被列出。