具体用什么函数先知道ip,然后通过ip得到主机名

解决方案 »

  1.   

    先用SOCKET得到自己的IP,再循环PING,用gethostbyaddr得到主机
      

  2.   

    先用SOCKET得到自己的IP,再循环PING,用gethostbyaddr得到主机
      

  3.   

    这个问题我不知道回答了多少遍了,需要代码给我发邮件。E-Mail:[email protected]
    拜托,大家以后想问这种问题,先看看这里有没有,省得我每次都重新写一遍,这是第N+1次回答了
    (N>=6)下面的代码经过测试,希望对你有用,发现最近好像很多人都在问这个问题,好用就给我加分,枚举网络中的所有计算机(我拿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();
    对了,我还有一个程序比这个算法快(用的是微软不公开的API函数),但是因为内容太多,你把邮箱地址提供一下,我给你发过去。如果对你有用,一定给我加分啊。刚才写的代码也有测试程序,你要也可以给你,记得知恩图报,给我加分就行了。我现在就想赚专家分:)
      

  4.   

    看一下PING。Cpp的源代码,(注意-a)这参数,网上这代码太多了
      

  5.   

    changlele(梦幻水晶) 下面的代码经过测试,希望对你有用,发现最近好像很多人都在问这个问题,好用就给我加分,枚举网络中的所有计算机(我拿CList测试一下,你可以拿别的测试)
    -------------------------------WNetEnumResource我早就用过了,我写的比你的要全
    WNetEnumResource这个东西只可以获得网上邻居里面的的所有计算机,网络邻居也有看不到的主机,你怎么办?
    我看只能一个一个ping,然后通过ip得到主机名,怎么通过ip得到主机名,gethostbyaddr也不知道可以不可以,先试一下在说
      

  6.   

    说实话,在csdn我问问题还从来没有得到过满意的答复,最后解决问题还是靠自己。
    可能这样说是伤了大家的感情,但是这的确是事实。
      

  7.   

    gethostbyaddr()探测不存在的IP好像特别慢!有没有同感???
      

  8.   

    to dawndu(东南飞) :你这个问题实际上不是“如何”而是“如何更好”,是不是?最保险的办法是逐个ping,但是这样效率较低。我认为优化一些的办法是结合snmp,因为一个局域网中应该有网关,而网关大多支持snmp协议。首先是发出一个全网广播的snmp,此时会立即得到所有支持snmp的主机的回应。然后再读取这些主机的MIB库,呵呵,接下来自己分析去。
      

  9.   

    开一百个线程,每个线程ping一个ip(ping3次),每次ping的超时时间为1秒,那么检测一个IP地址的时间是3秒,考虑并行工作,检测100个IP地址的时间也大概是3秒。
    检测一个255个主机地址的网段用不了10秒(考虑到启动线程的时间等其他消耗)。这个速度并不慢
      

  10.   

    开255×100个线程并不现实,但是开100个线程实在不多。流光就是开的100个线程进行的网络扫描。我自己就做过150个线程的,这对于Win2000来说并没有什么不可行的。
      

  11.   

    楼上似乎有什么话想说又没有说出口,不知道njtlxm(njtlxm)说的:
    1、并不是说开多少个线程的问题 (那是什么问题?)
    2、建议多研究一下多线程的机制 多线程机制?什么机制?多线程不就是用于这种目的吗?
    多线程就是为了尽量提高CPU和各种资源的利用率,在这里使用多线程是再恰当不过,不知道njtlxm(njtlxm)对此到底有什么异议.
      

  12.   

    以前写的有个例子,不知道你的EMail
      

  13.   

    to:楼上那些多线程并且用Ping来实现的人们
    这并不是一个可行的方法,如果我把ping服务(防火墙级别设成关闭ping服务)给关了,谁能给出更好的方法,是不是只能研究最底层网络服务了
    其实楼上njtlxm(njtlxm) 说的方法应该可行的(结合snmp)
      

  14.   

    ping当然只是众多方法中间的一种,任何一种方式都不是万能的。
    读取分析MIB库,看似好办法,但是同样存在问题:
    一:并非所有设备都支持snmp。
    二:读取分析MIB库工作量太大,需要大量的网络设备测试。
      

  15.   

    我认为,就这个任务而言,对于一个网段,使用多线程PING没有任何优势,在单cpu的计算机上与单线程没有什么区别.当然,如果要全部检查一个网段的IP地址,使用结合snmp不能大幅度地缩短搜索时间.但是,结合snmp能够在很短的时间内准确而有效地列举大多数IP地址.第一个snmp广播包,只需要一个,就会得到本网段内所有支持snmp计算机的响应.比如说10个.再去读取这10个计算机的MIB库(每个计算机发一个snmp Get请求),就能得到访问过这些计算机的其他IP地址.这样在短时间内可以得到网段内重要设备的IP地址信息,在GUI显示方面可以让用户立即看到这些信息,其余的可以逐个PING验证.
      

  16.   

    另外还可以参考fluke 的one touch,看看它的搜索机制
      

  17.   

    挺难说的,我要是网关都没有,怎么办?每个机器还要开启snmp服务吧?