• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            tqsheng

            go.....
            隨筆 - 366, 文章 - 18, 評(píng)論 - 101, 引用 - 0
            數(shù)據(jù)加載中……

            名字與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地址;如果失敗返回空指針。下面是定義:

            -------------------------------------------------------------------
            # include <netdb.h>

            struct hostent * gethostbyname (const char *hostname);

             -------------------------------------------------------------------

            參數(shù)hostname是主機(jī)的域名地址,函數(shù)將查詢的結(jié)果作為參數(shù)返回。如果失敗返回空指針;如果成功此參數(shù)返回的非空指針指向如下的hostent結(jié)構(gòu):

             

            -------------------------------------------------------------------
            struct hostent      {

            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ù)的形式如下:

            -------------------------------------------------------------------
            # include <netdb.h>

            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)容如下:

            1. #include <stdio.h>  
            2. #include <stdlib.h>  
            3. #include <string.h>  
            4. #include <sys/types.h>  
            5. #include <sys/socket.h>  
            6. #include <netinet/in.h>  
            7. #include <arpa/inet.h>  
            8. #include <netdb.h>  
            9.    
            10. main(int argc, const char **argv)  
            11. {  
            12.     ulong addr;  
            13.     struct hostent*hp;  
            14.     char **p;  
            15.     if (argc !=2) {  
            16.         (void)printf("usage: %s host_name\n", argv[0]);  
            17.         exit(1);  
            18.         }  
            19.     hp =gethostbyname(argv[1]);  
            20.     if (hp ==NULL) {  
            21.         (void)printf("host information for %s not found\n", argv[1]);  
            22.         exit(2);  
            23.         }  
            24.     for (p =hp->h_addr_list; *p != 0; p++) {  
            25.         structin_addr in;  
            26.         char**q;  
            27.         (void)memcpy(&in.s_addr, *p, sizeof(in.s_addr));  
            28.         (void)printf("%s\t%s", inet_ntoa(in), hp->h_name);  
            29.         for(q = hp->h_aliases; *q != 0; q++)  
            30.             (void) printf(" %s", *q);  
            31.         (void)putchar('\n');  
            32.         }  
            33.     exit (0);  
            34. }  
            35.    


             

            2、gethostbyaddr.c內(nèi)容如下:

            1. #include <stdio.h>  
            2. #include <stdlib.h>  
            3. #include <string.h>  
            4. #include <sys/types.h>  
            5. #include <sys/socket.h>  
            6. #include <netinet/in.h>  
            7. #include <arpa/inet.h>  
            8. #include <netdb.h>  
            9.    
            10. main(int argc, const char **argv)  
            11. {  
            12.      ulong addr;  
            13.      structhostent *hp;  
            14.      char **p;  
            15.      if (argc !=2) {  
            16.         (void)printf("usage: %s IP-address\n", argv[0]);  
            17.         exit(1);  
            18.         }  
            19.      if((int)(addr = inet_addr(argv[1])) == -1) {  
            20.         (void)printf("IP-address must be of the form a.b.c.d\n");  
            21.         exit(2);  
            22.         }  
            23.      hp =gethostbyaddr((char *)&addr, sizeof (addr), AF_INET);  
            24.      if (hp ==NULL) {  
            25.         (void)printf("host information for %s not found\n", argv[1]);  
            26.         exit(3);  
            27.         }  
            28.      for (p =hp->h_addr_list; *p != 0; p++) {  
            29.         structin_addr in;  
            30.         char**q;  
            31.         (void)memcpy(&in.s_addr, *p, sizeof (in.s_addr));  
            32.         (void)printf("%s\t%s", inet_ntoa(in), hp->h_name);  
            33.         for(q = hp->h_aliases; *q != 0; q++)  
            34.                   (void) printf(" %s", *q);  
            35.         (void)putchar('\n');  
            36.         }  
            37.      exit (0);  
            38. }  
            39.    

             

            posted on 2012-07-05 14:25 tqsheng 閱讀(340) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            99久久精品国产免看国产一区| 久久人人爽人爽人人爽av | 99久久免费国产精精品| 999久久久免费国产精品播放| 国产精品熟女福利久久AV| 久久久久久精品久久久久| .精品久久久麻豆国产精品| 久久精品无码一区二区app| 一本久久知道综合久久| 国产精品美女久久久免费 | 国产精品女同一区二区久久| 97视频久久久| 国产精品亚洲美女久久久| 久久久久亚洲av综合波多野结衣| 久久91精品国产91久久小草| 久久国产精品无| 91精品国产综合久久香蕉| 伊人久久大香线蕉亚洲五月天| 国产亚洲美女精品久久久| 久久人人爽人人爽人人片AV不| 亚洲国产精品狼友中文久久久| 国产精品久久永久免费| 人妻少妇久久中文字幕| 美女久久久久久| 精品久久久久一区二区三区| 国产美女久久精品香蕉69| 亚洲伊人久久大香线蕉综合图片 | av无码久久久久久不卡网站| yy6080久久| 一级a性色生活片久久无| 久久久精品国产Sm最大网站| 26uuu久久五月天| 欧美亚洲国产精品久久蜜芽| 久久精品国产亚洲77777| 亚洲精品无码久久久久久| 久久久久久午夜精品| 久久夜色精品国产亚洲| 久久九九久精品国产免费直播| 久久婷婷五月综合色奶水99啪| 久久最新免费视频| 亚洲日本va午夜中文字幕久久|