1. 程式人生 > >如何用C程式獲取www.baidu.com的ip地址?---實際是請求dns server解析

如何用C程式獲取www.baidu.com的ip地址?---實際是請求dns server解析

       怎樣用C程式獲取www.baidu.com的ip地址呢? 實際上, 這個問題我們之前間接討論過, 今天我們繼續來說一下。

       當然啦, 你得配dns地址, 也就是要指定dns伺服器, 否則, 怎麼能解析www.baidu.com呢?  當然了, 你可以直接ping www.baidu.com獲取, 結果如下:

C:\Documents and Settings\Administrator>ping www.baidu.com


Pinging www.a.shifen.com [180.97.33.107] with 32 bytes of data:


Reply from 180.97.33.107: bytes=32 time=41ms TTL=53
Reply from 180.97.33.107: bytes=32 time=28ms TTL=53
Reply from 180.97.33.107: bytes=32 time=32ms TTL=52
Reply from 180.97.33.107: bytes=32 time=31ms TTL=52


Ping statistics for 180.97.33.107:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 28ms, Maximum = 41ms, Average = 33ms

      當然啦, 你也可以用nslookup www.baidu.com, 結果如下:

C:\Documents and Settings\Administrator>nslookup www.baidu.com
Server:  dnspai-public-dns.dnspai.com
Address:  101.226.4.6


Non-authoritative answer:
Name:    www.a.shifen.com
Addresses:  180.97.33.108, 180.97.33.107
Aliases:  www.baidu.com

       那要用程式碼, 該怎麼搞呢? 直接上碼(其實無非就是gethostbyname觸發dns請求並儲存應答資訊

):

#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

int main()
{
	// 網路初始化
    WSADATA wsaData;
    WSAStartup(MAKEWORD(1,1), &wsaData);

	// 度娘來了
	char szWeb[] = "www.baidu.com";
    HOSTENT *pHost = gethostbyname(szWeb);

	// 列印度孃的ip地址(實際上, 這個地址經常變動, 所以如果你得到的地址不一致, 那也是正常的)
	if(NULL != pHost)
	{
		const char* pIPAddr = inet_ntoa(*((struct in_addr *)pHost->h_addr)) ;
		printf("web server ip is : %s\n", pIPAddr);
	}

	return 0;
}
        當網路是好的, 且dns配置正確, 那麼結果為:

web server ip is : 180.97.33.108

        看到沒, 其實我們啥也沒做, gethostbyname會觸發dns請求, 並把dns伺服器返回的ip資訊儲存在pHost中。 當然啦, 如果你把網路關了, 那麼pHost變為NULL.  好了, 本篇簡單的文章就介紹到此。