以前下载过一个这样的例程,后来不小心删除了,哪位大侠能够提供点这方面的信息?
那个程序好像用了两个线程,然后给局域网一定范围内的机器发送数据,返回的数据中包含该机器的名称和当前的用户名。

解决方案 »

  1.   

    已知IP地址用GetHostbyAddr()可以得到计算机名,然后就可以用GetHostByName()得到更多的信息.
      

  2.   

    gethostbyaddr()返回对应给定地址的主机信息
    gethostbyname()从一个主机数据库中返回对应网络地址的主机信息
      

  3.   

    我以前也想过,后来就懒了,直接拿了sdk里的一个函数用了(iphlpApi.h里的),忘了名字了!具体用socket我也没有试过,我帮你up!
      

  4.   

    用SOCKET枚举?
    可能要看一下相关的WINDOWS协议内容了。
    觉得很难。
    因为在98下假如不是WINS的话就好像是直接的UDP广播,
    假如有WINS就连接WINS服务器。
    在2000下好像是DNS
      

  5.   

    nicolas2001(nick) ( ) 能不能详细谈谈!
      

  6.   

    WNetOpenEnum
    WNetEnumResource
    WNetCloseEnum就是用来列举网络资源的,为什么要用WinSOck?
      

  7.   

    下面的代码经过测试,希望对你有用,发现最近好像很多人都在问这个问题,我已经是第3次回复这样的问题了,好用就给我加分,谢谢:)
    枚举网络中的所有计算机(我拿CList测试一下,你可以拿别的测试)
    需要指出的是还需要加入头文件
    #include "Winsock2.h"
    #include "afxtempl.h"
    #include "Winnetwk.h"加入lib链接Project—》setting-》link-》object\libary modules 中
    加入Ws2_32.lib Mpr.lib          CList<CString,CString&> m_list;

    m_list.RemoveAll(); 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.AddTail(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();
      

  8.   

    对了,我还有一个程序比这个算法快(用的是微软不公开的API函数),但是因为内容太多,你把邮箱地址提供一下,我给你发过去。如果对你有用,一定给我加分啊。刚才写的代码也有测试程序,你要也可以给你,记得知恩图报,给我加分就行了。我现在就想赚专家分:)