知道域名如何得知它的IP,用程序实现

解决方案 »

  1.   

    用gethostname和gethostbyname转换过来即可
      

  2.   

    //////////////////
       // 获得主机名.
       //
       char hostname[256];
       int res = gethostname(hostname, sizeof(hostname));
       if (res != 0) {
          printf("Error: %u\n", WSAGetLastError());
          return -1;
       }
       printf("hostname=%s\n", hostname);
       ////////////////
       // 根据主机名获取主机信息. 
       //
       hostent* pHostent = gethostbyname(hostname);
       if (pHostent==NULL) {
          printf("Error: %u\n", WSAGetLastError());
          return -1;
       }
       //////////////////
       // 解析返回的hostent信息.
       //
       hostent& he = *pHostent;
       printf("name=%s\naliases=%s\naddrtype=%d\nlength=%d\n",
          he.h_name, he.h_aliases, he.h_addrtype, he.h_length);
       
       sockaddr_in sa;
       for (int nAdapter=0; he.h_addr_list[nAdapter]; nAdapter++) {
          memcpy ( &sa.sin_addr.s_addr, he.h_addr_list[nAdapter],he.h_length);
          // 输出机器的IP地址.
          printf("Address: %s\n", inet_ntoa(sa.sin_addr)); // 显示地址串
       }
       //////////////////
       // 终止 Windows sockets API
       //
       WSACleanup();
      

  3.   

    楼上的人们没有几个听懂他的问题的,就danfeng(丹枫) 、carbon107(<软件开发思想.h>) 听明白了,难道大家不懂得国际域名的概念,他的意思是想知道一些网站的IP,
    例如:www.sina.com.cn,建议你去查查ping命令的编写方法,可能会管用,我在机器中测试了
    以下的命令,可能对你有启发,版主想要的信息无非是202.106.184.200这个信息C:\>ping sina.com.cnPinging sina.com.cn [202.106.184.200] with 32 bytes of data:Request timed out.
    Request timed out.
    Request timed out.
    Request timed out.Ping statistics for 202.106.184.200:
        Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
    Approximate round trip times in milli-seconds:
        Minimum = 0ms, Maximum =  0ms, Average =  0msC:\>
      

  4.   

    楼主用我说的方法可以得到IP地址.hostname代你的域名即可转换为IP
      

  5.   

    是呀!
    理解万岁!
    因为我在做一个远程监控,服务器端用的是动态IP
    要实现我的梦想,在世界的任一角落都能看到服务器端的视频
    我又装了一个花生壳程序,并在里面申请了一个域名
    所以,不管我的IP怎样变,那个域名是不会变的
    我就可以根据那个域名然后ping出它的IP后连过去
    可那样需要在运行里面去输入ping显得太麻烦
    我就想这个过程怎么可以让他包含在我的程序里面
    也就发了上面的问题(实在报谦,怪我没有说清楚)
      

  6.   

    To:小花猫。
    我也在作远程监控,我也遇到你的问题,我就是那样实现的,可以通过域名转化为IP,为什么怎么说你都不试试看那?奇怪.
    上面的是VCdaim,写成delphi形式的 Name参数代域名即可
    function HostToIP(Name: string; var Ip: string): Boolean;
    var
      wsdata: TWSAData;
      hostName: array[0..255] of char;
      hostEnt: PHostEnt;
      addr: PChar;
    begin
      WSAStartup($0101, wsdata);
      try
        gethostname(hostName, sizeof(hostName));
        StrPCopy(hostName, Name);
        hostEnt := gethostbyname(hostName);
        if Assigned(hostEnt) then
          if Assigned(hostEnt^.h_addr_list) then begin
            addr := hostEnt^.h_addr_list^;
            if Assigned(addr) then begin
              IP := Format('%d.%d.%d.%d', [byte(addr[0]),
                byte(addr[1]), byte(addr[2]), byte(addr[3])]);
              Result := True;
            end
            else
              Result := False;
          end
          else
            Result := False
        else begin
          Result := False;
        end;
      finally
        WSACleanup;
      end
    end;
    实现方式总归都是一样的,老兄。
      

  7.   

    你想,你可以用ping 
    ping www.csdn.net就会显示ip,那么你可以得到ping的代码吗?
    太多了吧,看看是什么, 哦,是:
    The Windows Sockets gethostbyname function gets host information corresponding to a hostname.struct hostent FAR * gethostbyname (    const char FAR * name
       );
      

  8.   

    u2m(breeze_wang)老兄,我正在试你那种方法,多谢!
      

  9.   

    TO:u2m(breeze_wang)老兄,我试了一下,它只会显示192.168.0.189
    这只是我本机的在我们公司的IP
    我是想用它得知这个:zlzq.vicp.net这个国际域名的IP
    你能让它显示为:218.13.101.110吗?
    是不是我那个地方搞错了,敬请指正!
      

  10.   

    fbmsf(FBM)的这种方法我试过,完全可以实现!没有必要那么复杂!
      

  11.   

    回复:u2m(breeze_wang) 
    楼主用我说的方法可以得到IP地址.hostname代你的域名即可转换为IP---------------------------------
    用你的话我可以编出一段程序,你试一下,分离出来的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];
    CString str = "www.sina.com.cn";
    strcpy(hostname,str);
    hp=gethostbyname(hostname);//主机信息



    memcpy(&localaddr,hp->h_addr,hp->h_length);//地址

    m_strIPAddress = inet_ntoa(localaddr);//变成char *
    WSACleanup();
    ----------------
    测试结果为
    localaddr = 202.106.185.×××你看看我再命令行中敲的东西,这是不同时间我在命令行运行的程序。IP根本就不一样C:\>ping www.sina.com.cnPinging libra.sina.com.cn [202.106.185.242] with 32 bytes of data:Request timed out.
    Request timed out.
    Request timed out.
    Request timed out.Ping statistics for 202.106.185.242:
        Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
    Approximate round trip times in milli-seconds:
        Minimum = 0ms, Maximum =  0ms, Average =  0msC:\>ping www.sina.com.cnPinging libra.sina.com.cn [202.106.185.231] with 32 bytes of data:Request timed out.
    Request timed out.
    Request timed out.
    Request timed out.Ping statistics for 202.106.185.231:
        Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
    Approximate round trip times in milli-seconds:
        Minimum = 0ms, Maximum =  0ms, Average =  0ms请版主好好看看。并不是做不了,就是因为数据可能错
      

  12.   

    greenbugs(小花猫) :应该是你哪里错了。
    我用上面的delphi函数测试了一下,肯定没错
    procedure TForm1.Button1Click(Sender: TObject);
    var
      _IP:string;
    begin
      HostToIP('www.sina.com.cn',_IP);
      showmessage(_IP);
    end;
    _IP为218.30.12.185
    VC我没有测试应该一样按照我上面的写法。你再检查下吧,是不是服务器没开,还是用到路由器了没开?
      

  13.   

    我们是用到路由器了,我只要一调用gethostbyname函数,就只会显我本机的IP
    192.168.0.189
    不知道该什么处理
      

  14.   

    你吧gethostname去掉,
    gethostbyname的参数设为"www.sina.com.cn"