简写转全称c语⾔编程,名字与IP地址转换编程
名字与IP地址转换编程
⼀、实验⽬的
理解名字与IP地址的转换函数,实现主机名与IP地址之间的转换。学习和掌握Linux下的gethostbyname()和gethostbyaddr()函数基本原理和基本编程⽅法。
⼆、实验平台
ubuntu-8.04操作系统
三、实验内容
1、利⽤gethostbyname()函数编程实现名字解析,将主机名转换成相应IP地址。
2、利⽤gethostbyaddr()函数编程实现反向地址解析,将IP地址转换成主机名,查询指定IP地址对应的主机域名地址。
四、实验原理
现在的⽹络都是使⽤名字来访问服务器的,⽽不是使⽤IP地址来访问。那它们是怎么转换的呢?答案就是利⽤名字与IP地址的转换函数实现的:gethostbyname和gethostbyaddr在主机名字与IP地址间进⾏转换。
1、gethostbyname()函数
主机名最基本的函数gethostbyname(),该函数执⾏如果成功,它返回⼀个指向结构hostent的指针,该结构中包含了该主机的所有
IPv4地址或IPv6地址;如果失败返回空指针。下⾯是定义:
-------------------------------------------------------------------
# include
struct hostent * gethostbyname (const char *hostname);
-------------------------------------------------------------------
参数hostname是主机的域名地址,函数将查询的结果作为参数返回。如果失败返回空指针;如果成功此参数返回的⾮空指针指向如下的hostent结构:
-------------------------------------------------------------------
struct hostent {
char * h_name; /*主机的正式名称*/
char * * h_aliases; /*主机的别名列表*/
int h_addrtype; /*主机地址类型*/
int h_length; /*主机地址长度*/
char * * h_addr_list; *主机IP地址的列表*/
};
# define h_addr h_addr_list[0] /*在列表中的第⼀个地址*/
-------------------------------------------------------------------
2、gethostbyaddr()函数
gethostbyaddr()函数的作⽤是可以查询指定的IP地址对应的主机域名地址。函数的形式如下:
-------------------------------------------------------------------
# include
struct hostent * gethostbyaddr (const char *addr, size_t len, int family);
-------------------------------------------------------------------
返回:若为⾮空指针,则表⽰成功;若为空指针,则表⽰出错,同时设置h_errno。该函数同样返回⼀个指向结构hostent的指针。⽽在参数中,参数addr不是char *类型,⽽是⼀个真正指向含有IPv4或IPv6地址的结构in_addr或in6_addr的指针;len是此结构的⼤⼩,对于IPv4地址为4,对于IPv6地址为16;参数family为AF_INET或AF_INET6。
五、实验步骤
1、登陆进⼊ubuntu操作系统,新建⼀个⽂件,命名为gethostbyname.c,新建另⼀个⽂件,命名为gethostbyaddr.c。
2、在gethostbyname.c和gethostbyaddr.c中编写相应代码并保存。
3、在“终端”(“Applications”→“附件”→“终端”)中执⾏命令进⼊gethostbyname.c和gethostbyaddr.c所在⽬录。(pwd命令可以显⽰当前所在⽬录;ls命令可以显⽰当前⽬录下的⽂件和⽂件夹信息;cd..命令可以进⼊上⼀级⽬录;cd ⽬录名 命令可以进⼊当前所⽰的某个⽬录。)
4、执⾏命令gcc –o gethostbyname gethostbyname.c⽣成可执⾏⽂件gethostbyname。
5、执⾏命令./gethostbyname host_name。(注意:此处host_name代表主机名,利⽤命令hostname可以查看本机的主机名)
6、观察并分析程序运⾏结果。
7、执⾏命令gcc –o gethostbyaddr gethostbyaddr.c⽣成可执⾏⽂件gethostbyaddr。
8、执⾏命令./gethostbyname 127.0.0.1,观察结果。
9、认真分析源代码,体会gethostbyname()和gethostbyaddr()函数的应⽤。
六、参考程序
1、gethostbyname.c内容如下:
#include #include #include #include #include #include #include #include main(int argc, const char **argv)
{
ulong addr;
struct hostent*hp;
char **p;
if (argc !=2) {
(void)printf("usage: %s host_name\n", argv[0]);c语言指针实验总结
exit(1);
}
hp =gethostbyname(argv[1]);
if (hp ==NULL) {
(void)printf("host information for %s not found\n", argv[1]);
exit(2);
}
for (p =hp->h_addr_list; *p != 0; p++) {
structin_addr in;
char**q;
(void)memcpy(&in.s_addr, *p, sizeof(in.s_addr));
(void)printf("%s\t%s", inet_ntoa(in), hp->h_name);
for(q = hp->h_aliases; *q != 0; q++)
(void) printf(" %s", *q);
(void)putchar('\n');
}
exit (0);
}
2、gethostbyaddr.c内容如下:
#include #include #include #include #include #include #include #include main(int argc, const char **argv) {
ulong addr;
structhostent *hp;
char **p;
if (argc !=2) {
(void)printf("usage: %s IP-address\n", argv[0]);
exit(1);
}
if((int)(addr = inet_addr(argv[1])) == -1) {
(void)printf("IP-address must be of the form d\n");
exit(2);
}
hp =gethostbyaddr((char *)&addr, sizeof (addr), AF_INET);
if (hp ==NULL) {
(void)printf("host information for %s not found\n", argv[1]);
exit(3);
}
for (p =hp->h_addr_list; *p != 0; p++) {
structin_addr in;
char**q;
(void)memcpy(&in.s_addr, *p, sizeof (in.s_addr));
(void)printf("%s\t%s", inet_ntoa(in), hp->h_name);
for(q = hp->h_aliases; *q != 0; q++) (void) printf(" %s", *q);
(void)putchar('\n');
}
exit (0);
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论