博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux学习笔记31——网络信息
阅读量:5129 次
发布时间:2019-06-13

本文共 3640 字,大约阅读时间需要 12 分钟。

一 主机数据库函数

#include 
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 
char *inet_ntoa(struct in_addr in);

函数作用:将一个因特网主机地址转换为一个点分四元组格式的字符串

#include 
int gethostname(char *name,int namelength);

函数作用:将当前主机的名字写入name指向的字符串中。主机名为null结尾。参数namelength指定了字符串name的长度,如果返回的主机名太长,它就会被截断

例子:

#include 
#include
#include
#include
#include
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 
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 
#include
#include
#include
#include
#include
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);}

 

转载于:https://www.cnblogs.com/zjzsky/p/3524514.html

你可能感兴趣的文章
关于PHP会话:session和cookie
查看>>
STM32F10x_RTC秒中断
查看>>
display:none和visiblity:hidden区别
查看>>
C#double转化成字符串 保留小数位数, 不以科学计数法的形式出现。
查看>>
牛的障碍Cow Steeplechase
查看>>
Zookeeper选举算法原理
查看>>
3月29日AM
查看>>
利用IP地址查询接口来查询IP归属地
查看>>
HTML元素定义 ID,Class,Style的优先级
查看>>
构造者模式
查看>>
http和https的区别
查看>>
Hbuild在线云ios打包失败,提示BuildConfigure Failed 31013 App Store 图标 未找到 解决方法...
查看>>
找到树中指定id的所有父节点
查看>>
今天新开通了博客
查看>>
AS3优化性能笔记二
查看>>
ElasticSearch(站内搜索)
查看>>
4----COM:a Generative Model for group recommendation(组推荐的一种生成模型)
查看>>
UVA 11137 - Ingenuous Cubrency
查看>>
js阻止事件冒泡的两种方法
查看>>
Java异常抛出
查看>>