名字與IP地址轉(zhuǎn)換編程
一、實(shí)驗(yàn)?zāi)康?/strong>
理解名字與IP地址的轉(zhuǎn)換函數(shù),實(shí)現(xiàn)主機(jī)名與IP地址之間的轉(zhuǎn)換。學(xué)習(xí)和掌握Linux下的gethostbyname()和gethostbyaddr()函數(shù)基本原理和基本編程方法。
二、實(shí)驗(yàn)平臺(tái)
ubuntu-8.04操作系統(tǒng)
三、實(shí)驗(yàn)內(nèi)容
1、利用gethostbyname()函數(shù)編程實(shí)現(xiàn)名字解析,將主機(jī)名轉(zhuǎn)換成相應(yīng)IP地址。
2、利用gethostbyaddr()函數(shù)編程實(shí)現(xiàn)反向地址解析,將IP地址轉(zhuǎn)換成主機(jī)名,查詢指定IP地址對(duì)應(yīng)的主機(jī)域名地址。
四、實(shí)驗(yàn)原理
現(xiàn)在的網(wǎng)絡(luò)都是使用名字來訪問服務(wù)器的,而不是使用IP地址來訪問。那它們是怎么轉(zhuǎn)換的呢?答案就是利用名字與IP地址的轉(zhuǎn)換函數(shù)實(shí)現(xiàn)的:gethostbyname和gethostbyaddr在主機(jī)名字與IP地址間進(jìn)行轉(zhuǎn)換。
1、gethostbyname()函數(shù)
找主機(jī)名最基本的函數(shù)gethostbyname(),該函數(shù)執(zhí)行如果成功,它返回一個(gè)指向結(jié)構(gòu)hostent的指針,該結(jié)構(gòu)中包含了該主機(jī)的所有IPv4地址或IPv6地址;如果失敗返回空指針。下面是定義:
------------------------------------------------------------------- struct hostent * gethostbyname (const char *hostname); ------------------------------------------------------------------- |
參數(shù)hostname是主機(jī)的域名地址,函數(shù)將查詢的結(jié)果作為參數(shù)返回。如果失敗返回空指針;如果成功此參數(shù)返回的非空指針指向如下的hostent結(jié)構(gòu):
------------------------------------------------------------------- char * h_name; /*主機(jī)的正式名稱*/ char * * h_aliases; /*主機(jī)的別名列表*/ int h_addrtype; /*主機(jī)地址類型*/ int h_length; /*主機(jī)地址長(zhǎng)度*/ char * * h_addr_list; *主機(jī)IP地址的列表*/ }; # define h_addr h_addr_list[0] /*在列表中的第一個(gè)地址*/ ------------------------------------------------------------------- |
|
2、gethostbyaddr()函數(shù)
gethostbyaddr()函數(shù)的作用是可以查詢指定的IP地址對(duì)應(yīng)的主機(jī)域名地址。函數(shù)的形式如下:
------------------------------------------------------------------- struct hostent * gethostbyaddr (const char *addr, size_t len, int family); ------------------------------------------------------------------- |
返回:若為非空指針,則表示成功;若為空指針,則表示出錯(cuò),同時(shí)設(shè)置h_errno。該函數(shù)同樣返回一個(gè)指向結(jié)構(gòu)hostent的指針。而在參數(shù)中,參數(shù)addr不是char *類型,而是一個(gè)真正指向含有IPv4或IPv6地址的結(jié)構(gòu)in_addr或in6_addr的指針;len是此結(jié)構(gòu)的大小,對(duì)于IPv4地址為4,對(duì)于IPv6地址為16;參數(shù)family為AF_INET或AF_INET6。
五、實(shí)驗(yàn)步驟
1、登陸進(jìn)入ubuntu操作系統(tǒng),新建一個(gè)文件,命名為gethostbyname.c,新建另一個(gè)文件,命名為gethostbyaddr.c。
2、在gethostbyname.c和gethostbyaddr.c中編寫相應(yīng)代碼并保存。
3、在“終端”(“Applications”→“附件”→“終端”)中執(zhí)行命令進(jìn)入gethostbyname.c和gethostbyaddr.c所在目錄。(pwd命令可以顯示當(dāng)前所在目錄;ls命令可以顯示當(dāng)前目錄下的文件和文件夾信息;cd..命令可以進(jìn)入上一級(jí)目錄;cd 目錄名 命令可以進(jìn)入當(dāng)前所示的某個(gè)目錄。)
4、執(zhí)行命令gcc –o gethostbyname gethostbyname.c生成可執(zhí)行文件gethostbyname。
5、執(zhí)行命令./gethostbyname host_name。(注意:此處host_name代表主機(jī)名,利用命令hostname可以查看本機(jī)的主機(jī)名)
6、觀察并分析程序運(yùn)行結(jié)果。
7、執(zhí)行命令gcc –o gethostbyaddr gethostbyaddr.c生成可執(zhí)行文件gethostbyaddr。
8、執(zhí)行命令./gethostbyname 127.0.0.1,觀察結(jié)果。
9、認(rèn)真分析源代碼,體會(huì)gethostbyname()和gethostbyaddr()函數(shù)的應(yīng)用。
六、參考程序
1、gethostbyname.c內(nèi)容如下:
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <netdb.h>
- main(int argc, const char **argv)
- {
- ulong addr;
- struct hostent*hp;
- char **p;
- if (argc !=2) {
- (void)printf("usage: %s host_name\n", argv[0]);
- exit(1);
- }
- hp =gethostbyname(argv[1]);
- if (hp ==NULL) {
- (void)printf("host information for %s not found\n", argv[1]);
- exit(2);
- }
- for (p =hp->h_addr_list; *p != 0; p++) {
- structin_addr in;
- char**q;
- (void)memcpy(&in.s_addr, *p, sizeof(in.s_addr));
- (void)printf("%s\t%s", inet_ntoa(in), hp->h_name);
- for(q = hp->h_aliases; *q != 0; q++)
- (void) printf(" %s", *q);
- (void)putchar('\n');
- }
- exit (0);
- }
2、gethostbyaddr.c內(nèi)容如下:
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <netdb.h>
- main(int argc, const char **argv)
- {
- ulong addr;
- structhostent *hp;
- char **p;
- if (argc !=2) {
- (void)printf("usage: %s IP-address\n", argv[0]);
- exit(1);
- }
- if((int)(addr = inet_addr(argv[1])) == -1) {
- (void)printf("IP-address must be of the form a.b.c.d\n");
- exit(2);
- }
- hp =gethostbyaddr((char *)&addr, sizeof (addr), AF_INET);
- if (hp ==NULL) {
- (void)printf("host information for %s not found\n", argv[1]);
- exit(3);
- }
- for (p =hp->h_addr_list; *p != 0; p++) {
- structin_addr in;
- char**q;
- (void)memcpy(&in.s_addr, *p, sizeof (in.s_addr));
- (void)printf("%s\t%s", inet_ntoa(in), hp->h_name);
- for(q = hp->h_aliases; *q != 0; q++)
- (void) printf(" %s", *q);
- (void)putchar('\n');
- }
- exit (0);
- }
posted on 2012-07-05 14:25 tqsheng 閱讀(340) 評(píng)論(0) 編輯 收藏 引用