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

欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

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

系統 1933 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條評論
主站蜘蛛池模板: 午夜爱爱爱爱爽爽爽网站免费 | 成人蜜桃av | 久久综合九九 | 日韩精品一区二区三区 | 亚洲精品在线视频观看 | 久久国产高清 | 奇米奇米 | 精品一区精品二区 | 国产亚洲精品久久精品录音 | 午夜不卡电影 | 亚洲人人 | 久久精品国产亚洲一区二区 | 国产精品久久久久久一级毛片 | 亚洲国产91 | 日本久久网 | 久久久精品国产 | 中文字幕在线一区二区三区 | 免费看污网站 | 97超碰免费 | 午夜视频一区二区三区 | 免费久久一级欧美特大黄 | 91网站在线观看视频 | 午夜久久久久久禁播电影 | 人人做人人爽人人爱 | 在线观看视频一区二区 | 久草在线观看首页 | 欧美在线高清 | 久久国产欧美日韩精品 | 午夜私人影院 | 成人一级 | 亚洲精品国偷拍自产在线观看 | 激情深爱| 特黄视频 | 国产国产精品人在线观看 | 99综合网 | 清清草免费视频 | 成人直播免费 | 双凤奇案 | 一二区视频| 成人午夜AV亚洲精品无码网站 | 91华人在线视频 |