Linux学习笔记31——网络信息

系统 1620 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条评论