structhostent*gethostbyaddr(constvoid*addr,//地址size_tlen,//長度inttype//類型);structhostent*gethostbyname(constchar*name);這些函數返回的結構中至少包含以下幾個成員structhostent{char*h_name;//主機名稱char**h_aliases;//別名列表inth_addrtype" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Linux學習筆記31——網絡信息

系統 1825 0

一 主機數據庫函數

      #include <netdb.h>


      
        struct
      
       hostent *gethostbyaddr(
      
        const
      
      
        void
      
       *addr,      //地址
      
                  size_t len,          //長度
int type           //類型
                 );
struct hostent *gethostbyname( const char *name);

  這些函數返回的結構中至少包含以下幾個成員

      
        struct
      
      
         hostent{

    
      
      
        char
      
       *h_name;          
      
        //
      
      
        主機名稱
      
      
        char
      
       **h_aliases;        
      
        //
      
      
        別名列表
      
      
        int
      
       h_addrtype;         
      
        //
      
      
        地址類型
      
      
        int
      
       h_length;          
      
        //
      
      
        地址長度
      
      
        char
      
       **h_addr_list;      
      
        //
      
      
        地址列表
      
      

};
    

  如果想獲得某臺計算機的主機數據庫信息,可以調用gethostbyname函數并且將結果打印出來,注意,要把返回的地址列表轉換為正確的地址類型,并用函數inet_ntoa將它們從網絡字節序轉換為可打印的字符串

      #include <arpa/inet.h>


      
        char
      
       *inet_ntoa(
      
        struct
      
       in_addr 
      
        in
      
      );
    

函數作用:將一個因特網主機地址轉換為一個點分四元組格式的字符串

      #include <unistd.h>


      
        int
      
       gethostname(
      
        char
      
       *name,
      
        int
      
       namelength);
    

函數作用:將當前主機的名字寫入name指向的字符串中。主機名為null結尾。參數namelength指定了字符串name的長度,如果返回的主機名太長,它就會被截斷

例子:

      #include <stdio.h>
      
        

#include 
      
      <arpa/inet.h>
      
        

#include 
      
      <stdlib.h>
      
        

#include 
      
      <netdb.h>
      
        

#include 
      
      <netinet/
      
        in
      
      .h>




      
        int
      
       main(
      
        int
      
       argc,
      
        char
      
       *
      
        argv[]){

    
      
      
        char
      
       *host,**names,**
      
        addrs;

    
      
      
        struct
      
       hostent *
      
        hostinfo;

    
      
      
        //
      
      
        把host變量設置為getname程序所提供的命令行參數,或默認設置為用戶主機的主機名
      
      
        if
      
      (argc==
      
        1
      
      
        ){

        
      
      
        char
      
       myname[
      
        256
      
      
        ];

        gethostname(myname,
      
      
        255
      
      
        );

        host
      
      =
      
        myname;

    }
      
      
        else
      
      
        {

        host
      
      =argv[
      
        1
      
      
        ];

    }

    
      
      
        //
      
      
        調用gethostbyname,如果未找到相應的信息就報告一條錯誤
      
      

    hostinfo=
      
        gethostbyname(host);

    
      
      
        if
      
      (!
      
        hostinfo){

        sprintf(stderr,
      
      
        "
      
      
        Cannot get info for host:%s\n
      
      
        "
      
      
        ,host);

        exit(
      
      
        1
      
      
        );

    }

    
      
      
        //
      
      
        顯示主機名和它可能有的所有別名
      
      

    printf(
      
        "
      
      
        result for host:%s\n
      
      
        "
      
      
        ,host);

    printf(
      
      
        "
      
      
        Name:%s\n
      
      
        "
      
      ,hostinfo->
      
        h_name);

    printf(
      
      
        "
      
      
        Aliases:
      
      
        "
      
      
        );

    names
      
      =hostinfo->
      
        h_aliases;

    
      
      
        while
      
      (*
      
        names){

        printf(
      
      
        "
      
      
        %s
      
      
        "
      
      ,*
      
        names);

        names
      
      ++
      
        ;

    }

    printf(
      
      
        "
      
      
        \n
      
      
        "
      
      
        );

    
      
      
        if
      
      (hostinfo->h_addrtype!=
      
        AF_INET){

        fprintf(stderr,
      
      
        "
      
      
        not an IP host!\n
      
      
        "
      
      
        );

        exit(
      
      
        1
      
      
        );    

    }

    addrs
      
      =hostinfo->
      
        h_addr_list;

    
      
      
        while
      
      (*
      
        addrs){

        printf(
      
      
        "
      
      
        %s
      
      
        "
      
      ,inet_ntoa(*(
      
        struct
      
       in_addr*)*
      
        addrs));

        addrs
      
      ++
      
        ;

    }

    printf(
      
      
        "
      
      
        \n
      
      
        "
      
      
        );

    exit(
      
      
        0
      
      
        );

}
      
    

?


二 服務信息函數

      #include <netdb.h>


      
        struct
      
       servent *getservbyname(
      
        const
      
      
        char
      
       *name,      
      
          //服務名稱
      
      
const char * proto         //指定用于連接該服務的協議,它的取值是tcp(用于SOCK_SREAM類型的TCP連接)和udp(用于SOCK_DGRAM類型的UPD數據報)
                 );
struct servent *getservbyport( int port,              //端口號
const char *proto
                 );


結構servent至少包含一下幾個成員

      
        struct
      
      
         servent{

    
      
      
        char
      
       *s_name;        
      
        //
      
      
        服務名稱
      
      
        char
      
       **s_aliases;
      
              //
      
      
        別名列表
      
      
        int
      
       s_port;         
      
        //
      
      
        IP端口號
      
      
        char
      
       *s_proto;       
      
        //
      
      
        服務類型
      
      

};
    

例子:

      #include <sys/socket.h>
      
        

#include 
      
      <netinet/
      
        in
      
      .h>
      
        

#include 
      
      <netdb.h>
      
        

#include 
      
      <stdio.h>
      
        

#include 
      
      <unistd.h>
      
        

#include 
      
      <stdlib.h>




      
        int
      
       main(
      
        int
      
       argc,
      
        char
      
       *
      
        argv[]){

    
      
      
        char
      
       *
      
        host;

    
      
      
        int
      
      
         sockfd;

    
      
      
        int
      
      
         len,result;

    
      
      
        struct
      
      
         sockaddr_in address;

    
      
      
        struct
      
       hostent *
      
        hostinfo;

    
      
      
        struct
      
       servent *
      
        servinfo;

    
      
      
        char
      
       buffer[
      
        128
      
      
        ];

    

    
      
      
        if
      
      (argc==
      
        1
      
      
        ){

        host
      
      =
      
        "
      
      
        localhost
      
      
        "
      
      
        ;

    }
      
      
        else
      
      
        {

        host
      
      =argv[
      
        1
      
      
        ];

    }

    
      
      
        //
      
      
        查找主機的地址,如果找不到,就報告一條錯誤
      
      

    hostinfo=
      
        gethostbyname(host);

    
      
      
        if
      
      (!
      
        hostinfo){

        fprintf(stderr,
      
      
        "
      
      
        no host:%s\n
      
      
        "
      
      
        ,host);

        exit(
      
      
        1
      
      
        );

    }

    
      
      
        //
      
      
        檢查主機上是否有daytime服務
      
      

    servinfo=getservbyname(
      
        "
      
      
        daytime
      
      
        "
      
      ,
      
        "
      
      
        tcp
      
      
        "
      
      
        );

    
      
      
        if
      
      (!
      
        servinfo){

        fprintf(stderr,
      
      
        "
      
      
        no daytime service\n
      
      
        "
      
      
        );

        exit(
      
      
        1
      
      
        );

    }

    printf(
      
      
        "
      
      
        daytime port is %d\n
      
      
        "
      
      ,ntohs(servinfo->
      
        s_port));

    
      
      
        //
      
      
        創建一個套接字
      
      

    sockfd=socket(AF_INET,SOCK_STREAM,
      
        0
      
      
        );

    
      
      
        //
      
      
        構造connect調用要使用的地址
      
      

    address.sin_family=
      
        AF_INET;

    address.sin_port
      
      =servinfo->
      
        s_port;

    address.sin_addr
      
      =*(
      
        struct
      
       in_addr*)*hostinfo->
      
        h_addr_list;

    len
      
      =
      
        sizeof
      
      
        (address);

    
      
      
        //
      
      
        然后建立連接并取得有關信息
      
      

    result=connect(sockfd,(
      
        struct
      
       sockaddr *)&
      
        address,len);

    
      
      
        if
      
      (result==-
      
        1
      
      
        ){

        perror(
      
      
        "
      
      
        oops:getdate
      
      
        "
      
      
        );

        exit(
      
      
        1
      
      
        );

    }

    result
      
      =read(sockfd,buffer,
      
        sizeof
      
      
        (buffer));

    buffer[result]
      
      =
      
        '
      
      
        \0
      
      
        '
      
      
        ;

    printf(
      
      
        "
      
      
        read %d bytes:%s
      
      
        "
      
      
        ,result,buffer);

    close(sockfd);

    exit(
      
      
        0
      
      
        );

}
      
    

?

Linux學習筆記31——網絡信息


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 91青娱乐在线 | 偶偶福利视频 | 国产精品免费久久久久影院 | 手机看片福利在线 | 国产成在线观看免费视频成本人 | 大学生一一级毛片在线播放 | 日韩中文字幕高清在线专区 | 中文字幕日本精品一区二区三区 | 欧美一级成人毛片视频 | 一级免费看片 | 成人深夜视频在线观看 | 99热视热频这里只有精品 | 91视频免费网站 | 免费一级a毛片 | 这里只有精品在线观看 | 国产欧美一区二区三区免费看 | 欧美日韩国产一区二区三区欧 | 天天综合日日噜噜噜 | 伊在人亚洲香蕉精品播放 | 欧美网站www | 手机福利片 | 手机看片国产 | 国产资源一区 | 国产香蕉偷在线观看视频 | 国产成人精品在线观看 | 欧美成人aaaaa免费视频 | 玖玖精品视频在线 | 日韩在线看片中文字幕不卡 | www.99色.com| 久久久久久亚洲精品影院 | 香蕉视频在线看 | 国产精品福利在线观看入口 | 日韩欧美国产综合 | 亚洲一区二区三区免费看 | 一区二区三区欧美日韩国产 | 国产成人91高清精品免费 | 91一区二区三区四区五区 | 一级毛片免费视频观看 | 国产一区在线看 | 国产大尺度视频 | 尤物视频在线观看视频 |